메타분석은 동일한 연구 주제로 수행된 다양한 연구로부터 도출된 결과를 계량적으로 분석하는 통합적인 접근 방법(research synthesis)을 의미한다. 일반적으로 동일한 연구 주제로 수행된 연구라할지라도 연구 결과는 연구마다 조금씩 다르기 때문에 어떤 치료(treatment)나 중재(intervention)에 대한 의사결정을 할 때 특정 연구(a single study)의 결과에만 의존하면 잘못된 결정을 내릴 위험이 크다. 따라서, 기존에 제시된 연구 결과를 종합적으로 분석할 수 있는 매커니즘이 필요하며, 이를 위해 메타분석법이 개발되었다.
메타분석의 간단한 역사는 다음과 같다.
1952년 Hans Eysenck는 정신요법(psychotherapy)이 별다른 효과를 보이지 않는 것으로 결론지어 이에대한 격렬한 논의가 시작되었으며, 이 후 20년간 수백 건의 연구가 진행되었으나 논쟁을 종결시키는 것에는 실패하였다. 이에 1976년 Gene Glass와 그의 동료 Smith는 Eysench의 결론이 잘못되었다는 것을 증명하기 위해 정신요법을 주제로 한 연구 375편을 통계적인 방법으로 통합을 시도하여 정신요법이 효과가 있는 것으로 결론을 내었으며, 이때 사용한 방법을 메타분석(Meta-analysis)라고 명명하였다.
전통적으로 통계적인 방법은 통계적 유의성 검정에 중점을 두지만, 이러한 방법은 여러 결과를 통합하는데 적절하지 않기 때문에 메타분석은 통계적 유의성보다 방향(direction)과 효과의 크기(magnitude of effects)에 중점을 두고 있다. 메타분석의 기본적인 수행 원리는 다음과 같다.
다음의 경우를 생각해보자. 예를 들어 BCG 백신의 효과를 밝히거나, 물리적 거리 또는 마스크가 COVID-19에 효과적인지, 만약 효과가 있다면 어느 정도의 효과를 가지는지 알아보고자 한다면 이와 관련한 연구들을 수집하여 메타분석을 통해 통합적으로 정량적 합성을 할 수 있다. 다음은 스트렙토키나아제(Streptokinase) 메타분석 예제이다. 1959년부터 1988년까지(약 30년간) 심장마비 후 사망을 예방하는 streptokinase의 능력을 평가하기 위해 총 33건의 무작위 시험이 시행되었으며(Introduction to Meta-Analysis, Borenstein et al., 2009), 이를 통합한 메타분석 결과는 다음과 같다.
위의 메타분석에 사용된 개별 연구 결과는 모두 유사한 프로토콜에 기반한 임상시험으로부터 도출되었다. 환자군은 무작위로 치료군 또는 위약군에 배정되었으며 동일한 결과 변수를 보고하였다. 결과를 살펴보면 33개의 연구 중 6개의 연구는 통계적으로 유의하고 나머지 27개의 연구는 유의하지 않은 결과를 보이고 있음을 알 수 있다. 즉, 연구 결과가 다양하여 이로 인해 streptokinase의 능력에 대해 명확한 결론을 내리기가 쉽지 않다. 이러한 경우 메타분석을 통해 통합적인 결론을 이끌어 낼 수 있다.
메타분석의 목적은 어떤 치료나 중재에 대한 의사결정을 하기 위해 특정 연구보다는 전체적인 연구 결과의 통합적 분석에 있다. 통합적 분석 방법으로는 체계적 문헌고찰(systematic reviews)과 메타분석(meta-analysis)이 존재한다. 체계적 문헌고찰은 정성/정량적인 분석방법을 기본으로, 때로는 정량적인 부분을 포함하지 않는 경우도 있다. 반면 메타분석은 계량적/정량적인 접근 방법에 주안을 두고 있으며, 때로는 비체계적인 문헌고찰을 수행한 후 메타분석을 하는 경우도 있다. 따라서 일반적으로 체계적 문헌고찰과 메타분석을 동일 또는 하위 개념으로 보기는 쉽지 않다.
과학적인 근거를 도출하는 방법은 사례보고, 질적연구, 상관관계연구, 실험조사설계 등 매우 다양하지만, 효과 검증을 위한 과학적인 근거에 대한 전통적 위계구조(hierarchy of evidence, level of evidence)에서는 체계적 문헌고찰과 메타분석이 중재 효과를 평가하는 과학적 근거로서 가장 상위에 위치하고 있다. 하지만 최근에는 전통적 위계구조의 최 상단에 위치한 체계적리뷰/메타분석을 따로 분리해서 보거나 혹은 하위에 존재하는 임상 시험 및 코호트 연구를 좀 더 세밀히 살피는 돋보기 역할로 봐야 한다는 주장이 대두되고 있다(Hassan Murad et al., 2016).
기존의 연구로부터 도출된 결과들을 통계적인 방법을 통해 체계적으로 분석하는 메타분석의 장점은 다음과 같다.
반면, 메타분석의 단점은 다음과 같다.
메타분석은 일반적인 조사연구의 단계인 1) 연구주제 선정, 2) 문헌의 검색, 3) 데이터 수집, 4) 데이터 분석, 5) 결과보고서 작성의 순서와 비슷하게 진행되며, 구체적인 단계는 다음과 같다.
메타분석의 첫 단계는 다른 조사연구와 마찬가지로 연구 질문을 구체적으로 제기하는 것이다. 연구 질문을 어떻게 제기하느냐에 따라 다음 사항들이 결정된다.
연구 질문이 결정되고 나면 다음 단계는 연구에 포함될 관련 문헌들을 검색하고 이를 찾아내는 것이다. 하지만 문헌 검색에 앞서 연구의 선정 기준(eligibility criteria)을 명확히 해야하며, 연구의 선정기준은 일반적으로 연구대상자(population or participants), 중재방법(intervention), 비교집단(comparison), 연구 결과(outcomes), 연구유형(study designs)을 의미하는 PICOS로 정리할 수 있다.
PICOS에 따라 연구 선정 기준이 정해지고 나면 관련 문헌, 즉 연구 결과들을 검색하게되며 검색 방법은 관련 학술 데이터베이스(예: Embase, PubMed 등)를 기본으로 하며, 이에 더해 관련 저널에 대한 수작업 검색(hand search), 회색문헌(grey literature)에 대한 검색, 적합도가 높은 연구논문의 참고문헌 검색, 연구자들을 직접 접촉하는 방법 등을 활용하게 된다. 문헌 검색은 체계적 문헌고찰과 함께 메타분석에 있어서 가장 중요한 부분 중 하나로, 충분히 포괄적이고 체계적이어야 한다. 문헌 검색은 다음과 같은 단계로 진행되는 것이 일반적이다.
2단계에서 검색된 문헌을 토대로 적절한 데이터를 추출해서 분석을 위한 코딩 작업을 하는 단계가 세 번째 단계이다. 최종 연구의 선정 과정은 일반적으로 다음과 같다.
이어서 최종 연구에 선정된 연구들을 대상으로 그 연구의 질을 확인하며, 다음은 메타분석에 포함된 각 개별연구를 코크란(Cochrane)의 Risk of Bias (ROB) 분석 도구를 통해 연구의 질을 분석한 사례이다.
다음 단계는 각 개별연구에서 데이터를 추출하여 코딩을 하며, 이 작업은 데이터 분석 및 통합을 위한 준비단계에 해당된다. 일반적으로 데이터 코딩에는 연구이름, 출간연도, 출간유형, 표본의 특성, 개입의 특성(개입기간, 횟수 등), 연구유형, 집단배정 방법, 측정도구, 효과크기 등에 대한 내용을 코딩한다.
데이터 분석 단계에서는 각 연구의 효과크기를 우선적으로 계산한 후 그 통계적 유의성을 살펴보고, 평균효과크기와 통계적 유의성을 보게 된다. 그리고 각 효과크기를 잘 표현해주는 forest plot을 기본적으로 제시한다.
메타분석 결과에 대한 보고는 일반적으로 여타 연구 결과 보고와 비슷하다. 연구 결과는 다음과 같이 구성된다.
효과크기(effect size)는 프로그램(개입)의 효과크기, 또는 변수 간 관계의 크기를 표현한 값을 의미한다. 메타분석에서 분석 단위(unit of currency in a meta analysis)에 해당되며, 일반적으로 효과크기의 유형으로는 표준화된 평균 차이(Cohen’s d, Hedges’g), 두 집단의 비율(risk ratio, odds ratio, risk difference), 두 변수 간의 상관계수(correlation coefficients) 등이 있다. 메타분석은 일반적으로 다음과 같은 순서로 진행된다.
각 연구의 효과크기는 신뢰구간(confidence interval)으로 경계를 표현하며, 각 연구에서 추정된 효과크기의 통계적 유의성(statistical significance)을 나타낸다. 예를 들어, 효과크기가 군간 차이를 나타낸다면 신뢰구간이 0을 포함하지 않을 때 통계적으로 유의하다. 또한, 신뢰구간은 효과크기의 정밀성(precision)을 나타내기도 하는데, 구간의 길이가 짧을수록 추정된 효과크기가 정밀하다고 볼 수 있다.
메타분석에서는 개별연구별로 서로 다른 가중값(weight)을 부여하며, 평균효과크기(summary effect size)를 계산할 때 사용한다. 일반적으로 가중값이 큰 연구들은 정밀성(precision)이 높은 연구이며, 가중값이 작은 연구들은 정밀성이 낮은 연구이다. 가중값은 분산의 역수(inverse of the variance)로 계산되며, 표본크기가 클수록(분산이 작을수록) 높은 가중값이 부여된다.
\[ W_i=\frac{1}{V_i}, \,\,\, W: 가중값,\,\,\, V: 분산 \]
메타분석의 주요 내용 중 한 가지는 평균효과크기 계산이다. 각 개별연구의 효과크기에 가중값을 부여해서 전체 연구의 효과크기, 즉 평균 효과크기를 산출한다. 또한 평균효과크기의 유의성을 판단함으로써 평균효과크기의 의미를 설명할 수 있다. 일반적으로 평균효과크기(mean effect size, summary effect size)는 전체효과크기(overall effect size), 효과의 가중평균(weighted mean effect) 등으로 불린다.
메타분석을 이해하려면 가장 기본적인 분석 결과인 forest plot을 먼저 이해해야 한다. Forest plot에는 각 개별연구의 효과크기, 통계적 유의성(정밀성), 가중값이 제시된다. 아울러 개별연구들을 종합한 평균 효과크기와 그 통계적 유의성도 제시된다.
Forest plot에서 정사각형(square)은 개별연구의 효과크기를 나타내고, 구체적으로 정사각형의 크기는 가중값, 정사각형의 위치는 효과크기의 방향(+ 또는 -)을 나타낸다. 정사각형의 가운데 위치는 크기(magnitude of the effect)를 표현한다. 다이아몬드(diamond)는 전체효과크기, 즉 평균효과크기(mean effect size 또는 summary effect size)를 나타낸다.
고정효과모형(fixed effect model), 랜덤효과모형(random effect model)
빈도주의모형(freqentest model), 베이지안모형(Bayesian model)
이질성(heterogeneity) 문제가 없을 때 메타분석 시행
이질성이 확인될 경우 원인 파악
이질성 원인을 설명하지 못한 경우 질적으로 기술(qualitative analysis)
일반적으로 두 집단 간 비교연구에서 보고되는 주요 통계량은 다음과 같다.
보통 연구 결과에는 두 집단의 평균, 표준편차, 표본크기가 제시되며, 메타분석에서 가장 일반적으로 선호되는 형태이다.
표준화되지 않은 평균차(raw mean difference)는 의미있는 결과 측정(예: 혈압)과 모든 연구에서 동일한 척도(measure)를 사용한 경우 적용가능하다. 모집단에서 평균차이 \(\Delta\)는 다음과 같이 정의된다.
\[ \Delta = \mu_1 - \mu_2 \] 이때, 모집단의 평균차 \(\Delta\)는 독립적인 두 집단(treatment and control)의 표본평균 \(\bar{X}_1\)과 \(\bar{X}_2\)로부터 추정되고 다음과 같이 \(D\)로 정의할 수 있다.
\[ D = \bar{X}_1 - \bar{X}_2 \] 만약, 두 모집단의 분산이 동일하다고 가정하면, \(\sigma_1 = \sigma_2 = \sigma\), \(i\)번째 연구에서의 평균차 \(D_1\)의 분산은 다음과 같다.
\[ Var(D_i )=\frac{n_1 + n_2}{n_1 n_2}S_p^2 \] 여기서 \(n_1\)은 첫번째 집단의 표본크기, \(n_2\)는 두번째 집단의 표본크기, 합동분산추정량(pooled variance estimator) \(S_p^2\)은 \[ S_p^2 = \frac{(n_1-1)S_1^2 + (n_2-1)S_2^2}{n_1 +n_2 -2} \] 이고, \(S_1^2\)과 \(S_2^2\)은 각 집단의 표본분산을 의미한다.
만약, 두 모집단의 분산이 다르다고 가정하면, \(\sigma_1 \ne \sigma_2\), \(i\)번째 연구에서의 평균차 \(S_i\)의 분산은 다음과 같다. \[ Var(D_i) = \frac{S_1^2}{n_1}+\frac{S_2^2}{n_2} \]
두 경우 모두 표준오차(standard error) \(S_p\)는 다음과 같다. \[ SE(D_i ) = \sqrt{Var(D_i)} \] \(i\)번째 연구에서 효과크기의 신뢰구간은 다음과 같다. \[ CI = D_i \pm z_{\alpha/2} \times SE(D_i ) \] \(i\)번째 연구의 가중값은 분산의 역수(inverse variance)로 정의하고 다음과 같다. \[ w_i = \frac{1}{Var(D_i)} \]
평균효과크기 \(M\)은 가중값을 이용한 가중평균으로 나타내며, 그 정의는 다음과 같다. \[ M = \frac{\sum_{i=1}^K w_iD_i}{\sum_{i=1}^K w_i} \] 평균효과크기 \(M\)의 분산과 표준오차는 다음과 같다. \[ Var(M)=\frac{1}{\sum_{i=1}^K w_i}, \quad SE(M)=\sqrt{Var(M)} \]
따라서 평균효과크기의 신뢰구간은 다음과 같다. \[ CI=M\pm z_{\alpha/2}\times SE(M) \]
두 집단간 비교연구에서 필요한 값은 각 집단의 표본크기(n1, n2), 평균(m1, m2), 표준편차(s1, s2) 값이다. 여기서는 10개의 개별 연구의 값을 입력한다.
cdata <- read.table(text='
study n1 m1 s1 n2 m2 s2
Leyand(2002) 29 0.06 0.1 16 0.03 0.12
NijKamp(2004) 68 0.13 0.2 69 0.16 0.2
Harman(2008) 24 0.07 0.13 19 0.08 0.1
Martinez(2008) 88 0.16 0.11 24 0.13 0.09
Ye(2010) 50 0.09 0.07 50 0.06 0.08
Peng(2012) 50 0.03 0.14 51 0.08 0.15
Rasp(2012) 111 0.62 0.32 29 0.62 0.38
Wilkins(2013) 94 0.08 0.12 93 0.06 0.16
Puell(2015) 21 0.13 0.08 18 0.08 0.12
', header=T)
cdata
## study n1 m1 s1 n2 m2 s2
## 1 Leyand(2002) 29 0.06 0.10 16 0.03 0.12
## 2 NijKamp(2004) 68 0.13 0.20 69 0.16 0.20
## 3 Harman(2008) 24 0.07 0.13 19 0.08 0.10
## 4 Martinez(2008) 88 0.16 0.11 24 0.13 0.09
## 5 Ye(2010) 50 0.09 0.07 50 0.06 0.08
## 6 Peng(2012) 50 0.03 0.14 51 0.08 0.15
## 7 Rasp(2012) 111 0.62 0.32 29 0.62 0.38
## 8 Wilkins(2013) 94 0.08 0.12 93 0.06 0.16
## 9 Puell(2015) 21 0.13 0.08 18 0.08 0.12
attach(cdata)
# 효과크기: 평균차
D <- m1 - m2
cbind(cdata,D)
## study n1 m1 s1 n2 m2 s2 D
## 1 Leyand(2002) 29 0.06 0.10 16 0.03 0.12 0.03
## 2 NijKamp(2004) 68 0.13 0.20 69 0.16 0.20 -0.03
## 3 Harman(2008) 24 0.07 0.13 19 0.08 0.10 -0.01
## 4 Martinez(2008) 88 0.16 0.11 24 0.13 0.09 0.03
## 5 Ye(2010) 50 0.09 0.07 50 0.06 0.08 0.03
## 6 Peng(2012) 50 0.03 0.14 51 0.08 0.15 -0.05
## 7 Rasp(2012) 111 0.62 0.32 29 0.62 0.38 0.00
## 8 Wilkins(2013) 94 0.08 0.12 93 0.06 0.16 0.02
## 9 Puell(2015) 21 0.13 0.08 18 0.08 0.12 0.05
### 합동분산추정량
sp2 <- ((n1-1)*s1^2 + (n2-1)*s2^2)/(n1+n2-2)
### D의 분산 (등분산)
varD <- (n1+n2)/(n1*n2)*sp2
### D의 분산 (이분산)
varD <- s1^2/n1 + s2^2/n2
### D의 표준오차
seD <- sqrt(varD)
cbind(cdata,D,varD)
## study n1 m1 s1 n2 m2 s2 D varD
## 1 Leyand(2002) 29 0.06 0.10 16 0.03 0.12 0.03 0.0012448276
## 2 NijKamp(2004) 68 0.13 0.20 69 0.16 0.20 -0.03 0.0011679454
## 3 Harman(2008) 24 0.07 0.13 19 0.08 0.10 -0.01 0.0012304825
## 4 Martinez(2008) 88 0.16 0.11 24 0.13 0.09 0.03 0.0004750000
## 5 Ye(2010) 50 0.09 0.07 50 0.06 0.08 0.03 0.0002260000
## 6 Peng(2012) 50 0.03 0.14 51 0.08 0.15 -0.05 0.0008331765
## 7 Rasp(2012) 111 0.62 0.32 29 0.62 0.38 0.00 0.0059018329
## 8 Wilkins(2013) 94 0.08 0.12 93 0.06 0.16 0.02 0.0004284603
## 9 Puell(2015) 21 0.13 0.08 18 0.08 0.12 0.05 0.0011047619
### 신뢰 하한
lb <- D - qnorm(0.975)*seD
### 신뢰 상한
ub <- D + qnorm(0.975)*seD
data.frame(study=cdata[,1],D,varD,lb,ub)
## study D varD lb ub
## 1 Leyand(2002) 0.03 0.0012448276 -0.0391516732 0.099151673
## 2 NijKamp(2004) -0.03 0.0011679454 -0.0969821940 0.036982194
## 3 Harman(2008) -0.01 0.0012304825 -0.0787520740 0.058752074
## 4 Martinez(2008) 0.03 0.0004750000 -0.0127164247 0.072716425
## 5 Ye(2010) 0.03 0.0002260000 0.0005352805 0.059464719
## 6 Peng(2012) -0.05 0.0008331765 -0.1065739613 0.006573961
## 7 Rasp(2012) 0.00 0.0059018329 -0.1505710727 0.150571073
## 8 Wilkins(2013) 0.02 0.0004284603 -0.0205698487 0.060569849
## 9 Puell(2015) 0.05 0.0011047619 -0.0151452022 0.115145202
### 가중값
W <- 1/varD
### 가중값 표준화
Wp <- W/sum(W)*100
data.frame(study=cdata[,1],D,varD,lb,ub,Wp)
## study D varD lb ub Wp
## 1 Leyand(2002) 0.03 0.0012448276 -0.0391516732 0.099151673 5.902006
## 2 NijKamp(2004) -0.03 0.0011679454 -0.0969821940 0.036982194 6.290516
## 3 Harman(2008) -0.01 0.0012304825 -0.0787520740 0.058752074 5.970812
## 4 Martinez(2008) 0.03 0.0004750000 -0.0127164247 0.072716425 15.467325
## 5 Ye(2010) 0.03 0.0002260000 0.0005352805 0.059464719 32.508759
## 6 Peng(2012) -0.05 0.0008331765 -0.1065739613 0.006573961 8.818035
## 7 Rasp(2012) 0.00 0.0059018329 -0.1505710727 0.150571073 1.244864
## 8 Wilkins(2013) 0.02 0.0004284603 -0.0205698487 0.060569849 17.147398
## 9 Puell(2015) 0.05 0.0011047619 -0.0151452022 0.115145202 6.650283
### 평균효과크기
M <- sum(W*D)/sum(W)
### 평균효과크기의 분산
varM <- 1/sum(W)
### 평균효과크기의 표준오차
seM <- sqrt(varM)
### 평균효과크기의 신뢰구간
lb <- M - qnorm(0.975)*seM
ub <- M + qnorm(0.975)*seM
data.frame(M, varM, seM, lb, ub)
## M varM seM lb ub
## 1 0.01602479 7.34698e-05 0.008571452 -0.0007749432 0.03282453
detach(cdata)
표준화 평균차(standardized mean difference; SMD)는 Cohen’s \(d\)로 불리며, \(i\)번째 연구에서의 표준화 평균차 \(d_i\)는 다음과 같이 정의한다.
\[ d_i = \frac{\bar{X_1}-\bar{X_2}}{S_p} \]
여기서 \(S_p\)는 합동표준편차 추정량(pooled standard deviation estimator)을 의미하며, \(S_p\)는 다음과 같다.
\[ S_p = \sqrt{\frac{(n_1 -1)S_1^2 + (n_2-1)S_2^2}{n_1+n_2-2}} \]
여기서 \(S_1^2\)과 \(S_2^2\)은 각 집단의 표본분산을 의미한다.
만약 \(t\) 또는 \(F\)값이 제시된 경우 \(d_i\)의 정의는 다음과 같다.
\[ d_i = t_i\sqrt{\frac{n_1+n_2}{n_1n_2}} \]
\[ d_i = \sqrt{\frac{F_i (n_1+n_2)}{n_1n_2}} \]
개별 연구의 표준화 평균차 \(d_i\)의 분산은 다음과 같이 정의한다.
\[
Var(d_i)=\frac{1}{n_1}+\frac{1}{n_2}+\frac{d_i^2}{2(n_1+n_2)}=\frac{n_1+n_2}{n_1n_2}+\frac{d_i^2}{2(n_1+n_2)}
\]
Cohen’s d는 표본크기가 작은 경우(\(n \le 20\)) 효과크기를 과대 추정하는 경향이 있다. 이를 보정(adjust)하기 위해 Hedges’g는 다음과 같이 정의한다.
\[ g_i = J \times d, \,\,\, J=1-\frac{3}{4(n_1+n_2)-9} \] Hedges’ g의 분산은 다음과 같다.
\[ Var(g_i)=J^2\times Var(d_i) \]
각 연구의 효과크기와 신뢰구간은 다음과 같다.
Cohen’s d의 경우: \[ CI(d_i)=d_i \pm z_{\alpha/2}\times SE(d_i), \quad SE(d_i)=\sqrt{Var(d_i)} \]
Hedges’ g의 경우: \[ CI(g_i)=g_i \pm z_{\alpha/2}\times SE(g_i), \quad SE(g_i)=\sqrt{Var(g_i)} \]
각 연구는 특성이 다르기 때문에 평균효과크기를 계산할 때 각 연구의 특성이 반영되어야 한다. 메타분석에서는 표본의 크기와 관련된 특성을 이용하며, 주로 표본 크기에 비례하는 가중값(weight)을 부과하여 가중평균의 형태로 평균효과크기(mean effect size)를 산출한다.
일반적으로 가장 많이 쓰이는 가중값의 형태는 분산의 역수로, 표본이 클수록 가중값이 커지게 된다.
\[ W_i = \frac{1}{Var_i} \]
평균효과크기는 아래 정의와 같이 가중값을 곱한 효과크기의 합, 즉 가중효과크기의 합을 가중값의 합으로 나눈 가중평균의 형태이며, 그 정의는 다음과 같다.
\[ M_d = \frac{\sum_{i=1}^K w_id_i}{\sum_{i=1}^K w_i} \]
\[ M_g = \frac{\sum_{i=1}^K w_ig_i}{\sum_{i=1}^K w_i} \]
평균효과크기의 표준오차, 신뢰구간, 그리고 유의성 검증을 위한 통계량은 다음과 같다.
평균효과크기: \[M = \frac{\sum_{i=1}^K w_ig_i}{\sum_{i=1}^K w_i}\]
분산과 표준오차: \[V_M = \frac{1}{\sum_{i=1}^K w_i}, \quad SE(M)=\sqrt{V_M}\]
검정 통계량(Test statistic) under \(H_0: M=0\) \[Z=\frac{M}{SE(M)}\]
신뢰구간: \[CI=(M-z_{\alpha/2}\times SE(M), M+z_{\alpha/2}\times SE(M))\]
\(t\)값: \[d=\pm t\sqrt{\frac{n_1+n_2}{n_1n_2}}\]
\(F\)값: \[d=\sqrt{\frac{F(n_1+n_2)}{n_1n_2}}\]
\(p-value\)가 제시된 경우: \[d=\pm t_{p-value}\sqrt{\frac{n_1+n_2}{n_1n_2}}\]
\(p<\alpha\)로 제시된 경우: \[d=\pm t_{\alpha}\sqrt{\frac{n_1+n_2}{n_1n_2}}\]
두 집단간 비교연구에서 필요한 값은 각 집단의 표본크기(n1, n2), 평균(m1, m2), 표준편차(s1, s2) 값이다. 여기서는 10개의 개별 연구의 값을 입력한다.
cdata2 <- read.table(text='
study m1 s1 n1 m2 s2 n2
"Cheng et al" 4.38 134 11 5.63 2.46 15
"Hsih et al" 6.3 0.59 2 6.3 2.67 22
"Liang et al" 5.19 1.47 21 7.21 2.94 84
"Song et al" 5.3 3.48 73 6.8 2.14 231
"Yuanyuan et al" 4.8 2.3 31 4.2 1.5 23
"Zhao et al" 4.92 4.71 19 6.18 6.67 15
"Zhu et al" 5.3 2.1 32 6.3 2.3 84
', header=T)
cdata2
## study m1 s1 n1 m2 s2 n2
## 1 Cheng et al 4.38 134.00 11 5.63 2.46 15
## 2 Hsih et al 6.30 0.59 2 6.30 2.67 22
## 3 Liang et al 5.19 1.47 21 7.21 2.94 84
## 4 Song et al 5.30 3.48 73 6.80 2.14 231
## 5 Yuanyuan et al 4.80 2.30 31 4.20 1.50 23
## 6 Zhao et al 4.92 4.71 19 6.18 6.67 15
## 7 Zhu et al 5.30 2.10 32 6.30 2.30 84
attach(cdata2)
### 합동분산추정량
sp2 <- ((n1-1)*s1^2 + (n2-1)*s2^2)/(n1+n2-2)
### 표준오차
sp <- sqrt(sp2)
### 표준화 평균차
d <- (m1 - m2)/sp
cbind(cdata2,sp,d)
## study m1 s1 n1 m2 s2 n2 sp d
## 1 Cheng et al 4.38 134.00 11 5.63 2.46 15 86.517032 -0.01444802
## 2 Hsih et al 6.30 0.59 2 6.30 2.67 22 2.611644 0.00000000
## 3 Liang et al 5.19 1.47 21 7.21 2.94 84 2.717503 -0.74332941
## 4 Song et al 5.30 3.48 73 6.80 2.14 231 2.524881 -0.59408748
## 5 Yuanyuan et al 4.80 2.30 31 4.20 1.50 23 2.000961 0.29985587
## 6 Zhao et al 4.92 4.71 19 6.18 6.67 15 5.651765 -0.22293920
## 7 Zhu et al 5.30 2.10 32 6.30 2.30 84 2.247377 -0.44496324
### d의 분산
vard <- 1/n1+1/n2+d^2/(2*(n1+n2))
### D의 표준오차
sed <- sqrt(vard)
### 신뢰 하한
lb <- d - qnorm(0.975)*sed
### 신뢰 상한
ub <- d + qnorm(0.975)*sed
data.frame(study=cdata2[,1],d,vard,lb,ub)
## study d vard lb ub
## 1 Cheng et al -0.01444802 0.15757977 -0.7924816 0.76358553
## 2 Hsih et al 0.00000000 0.54545455 -1.4475293 1.44752933
## 3 Liang et al -0.74332941 0.06215495 -1.2319659 -0.25469287
## 4 Song et al -0.59408748 0.01860813 -0.8614493 -0.32672563
## 5 Yuanyuan et al 0.29985587 0.07656886 -0.2424873 0.84219904
## 6 Zhao et al -0.22293920 0.12002916 -0.9019731 0.45609472
## 7 Zhu et al -0.44496324 0.04400818 -0.8561270 -0.03379953
### 가중값
W <- 1/vard
### 가중값 표준화
Wp <- W/sum(W)*100
data.frame(study=cdata2[,1],d,vard,W,Wp)
## study d vard W Wp
## 1 Cheng et al -0.01444802 0.15757977 6.345992 5.196411
## 2 Hsih et al 0.00000000 0.54545455 1.833333 1.501224
## 3 Liang et al -0.74332941 0.06215495 16.088824 13.174321
## 4 Song et al -0.59408748 0.01860813 53.739958 44.004922
## 5 Yuanyuan et al 0.29985587 0.07656886 13.060140 10.694285
## 6 Zhao et al -0.22293920 0.12002916 8.331309 6.822086
## 7 Zhu et al -0.44496324 0.04400818 22.723050 18.606751
### 평균효과크기
Md <- sum(W*d)/sum(W)
### 평균효과크기의 분산
varMd <- 1/sum(W)
### 평균효과크기의 표준오차
seMd <- sqrt(varMd)
### 평균효과크기의 신뢰구간
lb <- Md - qnorm(0.975)*seMd
ub <- Md + qnorm(0.975)*seMd
data.frame(Md, varMd, seMd, lb, ub)
## Md varMd seMd lb ub
## 1 -0.426042 0.008188492 0.09049029 -0.6033997 -0.2486843
### 보정된 표준화 평균차 Hedges' g
J <- (1-3/(4*(n1+n2)-9))
g <- d * J
### g의 분산과 표준오차
varg <- J^2*vard; seg <- sqrt(varg)
### 신뢰 하한
lbg <- g - qnorm(0.975)*seg
### 신뢰 상한
ubg <- g + qnorm(0.975)*seg
data.frame(study=cdata2[,1],g,varg,lbg,ubg)
## study g varg lbg ubg
## 1 Cheng et al -0.01399177 0.14778451 -0.7674558 0.73947230
## 2 Hsih et al 0.00000000 0.50848557 -1.3976145 1.39761453
## 3 Liang et al -0.73790365 0.06125089 -1.2229735 -0.25283380
## 4 Song et al -0.59261087 0.01851574 -0.8593082 -0.32591355
## 5 Yuanyuan et al 0.29551014 0.07436555 -0.2389730 0.82999326
## 6 Zhao et al -0.21767292 0.11442546 -0.8806667 0.44532083
## 7 Zhu et al -0.44202942 0.04342976 -0.8504822 -0.03357668
### 가중값
Wg <- 1/varg
### 가중값 표준화
Wpg <- Wg/sum(Wg)*100
data.frame(study=cdata2[,1],g,varg,Wg,Wpg)
## study g varg Wg Wpg
## 1 Cheng et al -0.01399177 0.14778451 6.766609 5.444661
## 2 Hsih et al 0.00000000 0.50848557 1.966624 1.582418
## 3 Liang et al -0.73790365 0.06125089 16.326294 13.136734
## 4 Song et al -0.59261087 0.01851574 54.008098 43.456891
## 5 Yuanyuan et al 0.29551014 0.07436555 13.447086 10.820017
## 6 Zhao et al -0.21767292 0.11442546 8.739314 7.031971
## 7 Zhu et al -0.44202942 0.04342976 23.025684 18.527308
### 평균효과크기
Mg <- sum(Wg*g)/sum(Wg)
### 평균효과크기의 분산
varMg <- 1/sum(Wg)
### 평균효과크기의 표준오차
seMg <- sqrt(varMg)
### 평균효과크기의 신뢰구간
lbg <- Mg - qnorm(0.975)*seMg
ubg <- Mg + qnorm(0.975)*seMg
data.frame(Mg, varMg, seMg, lbg, ubg)
## Mg varMg seMg lbg ubg
## 1 -0.4204571 0.008046366 0.08970154 -0.5962689 -0.2446453
두 집단(사전-사후검사)인 경우, 아래와 같이 연구결과에 보고한다. \(D_T\)를 treatment 집단의 사전-사후에 대한 평균값, \(D_C\)를 control 집단의 사전-사후에 대한 평균값이라 할때 효과크기 \(d\)는 다음과 같이 정의한다.
\[ d_{diff}=\frac{\bar{D_T}-\bar{D_C}}{S_{diff_p}} \] 여기서, \(S_{diff_p}\)는 다음과 같다.
\[ S_{diff_p} = \sqrt{\frac{(n_1 -1)S_{diff_1}^2 + (n_2-1)S_{diff_2}^2}{n_1+n_2-2}} \]
효과크기, 분산 등과 평균효과크기의 표준오차, 신뢰구간, 그리고 유의성 검증을 위한 통계량은 다음과 같다.
*효과크기 \(d_{diff}\)의 분산
\[ Var(d_{diff})=\frac{1}{n_1}+\frac{1}{n_2}+\frac{d_i^2}{2(n_1+n_2)} \]
\[ g_i = J \times d_{diff}, \,\,\, J=1-\frac{3}{4(n_1+n_2)-9} \]
\[ Var(g_i)=J^2\times Var(d_i) \]
\[ CI(d_{diff})=d_{diff} \pm z_{\alpha/2}\times SE(d_{diff}), \quad SE(d_{diff})=\sqrt{Var(d_{diff})} \]
\[ CI(g_i)=g_i \pm z_{\alpha/2}\times SE(g_i), \quad SE(g_i)=\sqrt{Var(g_i)} \]
가중값 \[ W_i = \frac{1}{Var_i} \]
평균효과크기: \[M = \frac{\sum_{i=1}^K w_ig_i}{\sum_{i=1}^K w_i}\]
분산과 표준오차: \[V_M = \frac{1}{\sum_{i=1}^K w_i}, \quad SE(M)=\sqrt{V_M}\]
검정 통계량(Test statistic) under \(H_0: M=0\) \[Z=\frac{M}{SE(M)}\]
신뢰구간: \[CI=(M-z_{\alpha/2}\times SE(M), M+z_{\alpha/2}\times SE(M))\]
단일집단(사전-사후검사)인 경우, 두 집단 비교와는 조금 다른 공식을 활용하며, 사전-사후검사의 상관계수가 필요하다. 사후 측정값을 \(X\)로 두고 사전 측정값을 \(Y\), \(r\)은 사전-사후 간의 상관계수, 사전과 사후 측정값의 표준편차를 각각 \(S_1\), \(S_2\)라 할 때 효과크기 \(d_i\)와 그 분산은 다음과 같이 정의한다.
\[ d_i=\frac{\bar{X}-\bar{Y}}{S_p} \]
여기서, \(S_p\)는 다음과 같다.
\[ S_p = \frac{\sqrt{S_1^2+S_2^2-2rS_1S_2}}{\sqrt{2(1-r)}} \]
또한 효과크기 \(d\)의 분산과 표준오차는 다음과 같다.
\[ Var(d_i)=(\frac{1}{n}+\frac{d^2}{2n})\times 2(1-r), \quad SE(d)=\sqrt{Var(d)} \]
보정된 효과크기 \(g\)를 얻기 위한 보정지수(correction factor) \(J\)는 다음과 같다.
\[ J=1-(\frac{3}{4df-1}), \quad df=n-1 \]
\[ CI(d_i)=d_i \pm z_{\alpha/2}\times SE(d_i), \quad SE(d_i)=\sqrt{Var(d_i)} \]
\[ CI(g_i)=g_i \pm z_{\alpha/2}\times SE(g_i), \quad SE(g_i)=\sqrt{Var(g_i)} \]
이후의 과정(신뢰구간, 가중값, 평균효과크기등의 추정)은 다음과 같다.
가중값 \[ W_i = \frac{1}{Var(d_i)} \]
평균효과크기: \[M = \frac{\sum_{i=1}^K w_ig_i}{\sum_{i=1}^K w_i}\]
분산과 표준오차: \[V_M = \frac{1}{\sum_{i=1}^K w_i}, \quad SE(M)=\sqrt{V_M}\]
검정 통계량(Test statistic) under \(H_0: M=0\) \[Z=\frac{M}{SE(M)}\]
신뢰구간: \[CI=(M-z_{\alpha/2}\times SE(M), M+z_{\alpha/2}\times SE(M))\]
이분형(binary) 자료의 경우, 효과크기는 평균차이가 아닌 상대위험률(relative resk, RR) 또는 오즈비(odds ratio, OR)를 주로 이용한다.
요인의 결과가 각각 두 개의 범주로 나누어진 분할표(\(2\times 2\) contigency table) 자료의 경우 연관성을 나타내는 측도로 주로 사용되는 것은 상대위험률(RR)과 오즈비(OR)이며, 그 정의는 다음과 같다.
| 집단 | Event | No-Event | Total |
|---|---|---|---|
| 실험 | \(a\) | \(b\) | \(n_1\) |
| 통제 | \(c\) | \(d\) | \(n_2\) |
상대위험률:
\[ RR=\frac{a/(a+b)}{c/(c+d)}=\frac{a/n_1}{c/n_2}=\frac{an_2}{cn_1} \] 오즈비:
\[
OR = \frac{a/b}{c/d}=\frac{ad}{bc}
\]
상대위험률과 오즈비의 해석은 다음과 같다. 예를 들어 상대위험률이 \(RR=2.0\)인 경우, 실험집단이 통제집단에 비해 Event가 발생할 확률이 2배 높다는 의미이다. 그리고 만약 \(RR=0.1\)이라면, 실험집단의 이벤트 발생 확률이 통제집단에 비해 \(95\%\) 낮다는 의미이다. 반면, 오즈비의 경우 \(OR=2.0\)이면, Event가 발생하지 않을 경우에 비해 이벤트가 발생할 경우가 통제집단에 비해 실험집단이 두 배가 된다는 의미이다. 즉, 상대위험률처럼 직접적인 확률의 비로 해석하기가 쉽지 않다. 다만 \(OR\)이 1보다 크다면 실험집단의 Event 발생 가능성이 통제집단보다 크다는 것을 알 수 있으며, Event 발생 확률이 매우 낮다면 \(RR\)과 \(OR\)값은 거의 같은 값을 보인다.
상대위험률과 오즈비는 그대로 사용하지 않고 자연로그 변환값을 사용한다. 로그변환을 취한 경우에는 수치비교가 용이해지며, 범위가 \(-\infty\)에서 \(\infty\) 값을 취하기 때문에 \(0\)의 경우 효과크기가 없음(neutal value)을 나타낸다. 또한, 로그변환을 통해 정규분포에 가깝게 만들 수 있다.
로그 변환후의 \(RR\)은 다음과 같다. \[ Log(RR_i)=log(\frac{a/(a+b)}{c/(c+d)}) \]
로그 변환후의 분산은 다음과 같다.
\(Log(RR)\)의 분산:
\[ Var(Log(RR_i))=\frac{1}{a}-\frac{1}{n_1}+\frac{1}{c}-\frac{1}{n_2} \] 따라서 \(Log(RR)\)의 신뢰구간은 다음과 같이 정의된다. \[ CI=Log(RR_i) \pm z_{\alpha/2}\times SE(Log(RR_i)) \] 상대위험률(RR)에 대한 신뢰구간은 \(Log(RR)\)의 신뢰구간에 지수함수(exponential)를 취해서 산출한다. \[ CI(RR)=exp(Log(RR_i) \pm z_{\alpha/2}\times SE(Log(RR_i))) \] 평균효과크기 산출을 위한 가중값 적용 방법은 역분산(Inverse variance) 방법과 Mantel-Haenszel (MH) 방법이 사용되며 먼저 역분산 방법을 살펴보자.
역분산 방법에서 가중값 \(w\)는 \(Log(RR)\)의 분산의 역수로 정의된다. \[ w_i = \frac{1}{Var(Log(RR_i))} \] 따라서 로그변환 평균효과크기 \(Log(\theta)\)는 다음과 같다. \[ Log(\theta)=\frac{\sum_{i=1}^K w_i Log(RR_i)}{\sum_{i=1}^K w_i} \] 이에 \(Log(\theta)\)의 분산과 신뢰구간은 다음과 같다.
\(Log(\theta)\)의 분산 \[ Var(Log(\theta)) = \frac{1}{\sum_{i=1}^K w_i} \]
\(Log(\theta)\)의신뢰구간 \[ CI=Log(\theta) \pm z_{\alpha/2}\times SE(Log(\theta)) \]
따라서 상대위험률의 평균효과크기와 신뢰구간은 다음과 같다.
\[ \theta=exp(Log(\theta))=exp(\frac{\sum_{i=1}^K w_i Log(RR_i)}{\sum_{i=1}^K w_i}) \]
\[ CI(\theta) = exp(Log(\theta)\pm z_{\alpha/2}\times SE(Log(\theta))) \]
MH 방법에서 가중값 \(w\)는 역분산 방법과 달리 효과크기 \(RR\)에 직접 정의된다. \[ w_i = \frac{(a+b)c}{n_1+n_2}=\frac{(a+b)c}{n}, \,\,\,n=n_1+n_2 \]
따라서 평균효과크기 \(\theta\)는 다음과 같다. \[ \theta=\frac{\sum_{i=1}^K w_i RR_i}{\sum_{i=1}^K w_i} \] 반면, 평균효과크기 \(\theta\)의 분산은 직접적으로 구할 수 없어 \(Log(\theta)\)로 접근하며, 이에 \(Log(\theta)\)의 분산과 신뢰구간은 다음과 같다.
\(Log(\theta)\)의 분산 \[ Var(Log(\theta)) = \frac{\sum_{i=1}^K(n_1n_2(a+c)-acn)/n^2}{(\sum_{i=1}^K an_2/n)\times (\sum_{i=1}^K cn_1/n)} \]
\(Log(\theta)\)의신뢰구간 \[ CI=Log(\theta) \pm z_{\alpha/2}\times SE(Log(\theta)) \]
따라서 상대위험률의 신뢰구간은 다음과 같다.
\[ CI(\theta) = exp(Log(\theta)\pm z_{\alpha/2}\times SE(Log(\theta))) \]
이분형 자료를 위한 연구에서 필요한 값은 각 집단의 표본크기(n1, n2)와 event 발생 횟수(e1, e2) 값이다. 여기서는 8개의 개별 연구의 값을 이용하여 pooled RR값을 산출해보자.
rrdata <- read.table(text='
Study e1 n1 e2 n2
"B. Yu, 2020" 9 48 238 502
"ES. Rosenberg, 2020" 54 271 28 221
"FJ. MeMbrillo, 2020" 27 123 21 43
"J. Barbosa, 2020" 2 17 1 21
"J. Magagnoli, 2020" 38 1698 37 395
"M. Mahevas, 2020" 9 84 8 89
"P. Gautret, 2020" 1 20 0.5 16
"S. Singh, 2020" 104 910 109 910
', header=T)
rrdata
## Study e1 n1 e2 n2
## 1 B. Yu, 2020 9 48 238.0 502
## 2 ES. Rosenberg, 2020 54 271 28.0 221
## 3 FJ. MeMbrillo, 2020 27 123 21.0 43
## 4 J. Barbosa, 2020 2 17 1.0 21
## 5 J. Magagnoli, 2020 38 1698 37.0 395
## 6 M. Mahevas, 2020 9 84 8.0 89
## 7 P. Gautret, 2020 1 20 0.5 16
## 8 S. Singh, 2020 104 910 109.0 910
attach(rrdata)
## The following objects are masked from cdata2:
##
## n1, n2
### 효과크기 RR
RR <- e1*n2/e2/n1
### 효과크기 로그변환
logRR <- log(RR)
### Log(RR)의 분산
var_logrr <- 1/e1-1/n1+1/e2-1/n2
cbind(rrdata, RR, logRR, var_logrr)
## Study e1 n1 e2 n2 RR logRR var_logrr
## 1 B. Yu, 2020 9 48 238.0 502 0.3954832 -0.92764699 0.09248743
## 2 ES. Rosenberg, 2020 54 271 28.0 221 1.5727464 0.45282342 0.04601788
## 3 FJ. MeMbrillo, 2020 27 123 21.0 43 0.4494774 -0.79966981 0.05327019
## 4 J. Barbosa, 2020 2 17 1.0 21 2.4705882 0.90445627 1.39355742
## 5 J. Magagnoli, 2020 38 1698 37.0 395 0.2389138 -1.43165235 0.05022224
## 6 M. Mahevas, 2020 9 84 8.0 89 1.1919643 0.17560261 0.21297039
## 7 P. Gautret, 2020 1 20 0.5 16 1.6000000 0.47000363 2.88750000
## 8 S. Singh, 2020 104 910 109.0 910 0.9541284 -0.04695698 0.01659189
### Log(RR)의 신뢰구간
lower_logrr <- logRR - qnorm(0.975)*sqrt(var_logrr)
upper_logrr <- logRR + qnorm(0.975)*sqrt(var_logrr)
### 원 자료의 신뢰구간
lower_rr <- exp(lower_logrr)
upper_rr <- exp(upper_logrr)
### Log(RR)의 가중값 - Mantel Haenszel (MH)
w <- n1*e2/(n1+n2)
wp <- w/sum(w)*100
data.frame(Study=rrdata[,1], RR, lower_rr, upper_rr, wp)
## Study RR lower_rr upper_rr wp
## 1 B. Yu, 2020 0.3954832 0.21790279 0.7177832 14.7436206
## 2 ES. Rosenberg, 2020 1.5727464 1.03290610 2.3947301 10.9473968
## 3 FJ. MeMbrillo, 2020 0.4494774 0.28592204 0.7065908 11.0449807
## 4 J. Barbosa, 2020 2.4705882 0.24432346 24.9824807 0.3175514
## 5 J. Magagnoli, 2020 0.2389138 0.15398708 0.3706792 21.3068291
## 6 M. Mahevas, 2020 1.1919643 0.48244151 2.9449764 2.7572225
## 7 P. Gautret, 2020 1.6000000 0.05724049 44.7235828 0.1971724
## 8 S. Singh, 2020 0.9541284 0.74124875 1.2281452 38.6852265
### 평균효과크기 theta
theta = sum(w*RR)/sum(w)
### Log(theta)의 분산
varlogtheta = sum((n1*n2*(e1+e2)-e1*e2*(n1+n2))/(n1+n2)**2)/sum(e1*n2/(n1+n2))/sum(e2*n1/(n1+n2))
### Log(theta)의 신뢰구간
lb = log(theta) - qnorm(0.975)*sqrt(varlogtheta)
ub = log(theta) + qnorm(0.975)*sqrt(varlogtheta)
### 상대위험률 평균효과크기의 신뢰구간
lbrr = exp(lb)
ubrr = exp(ub)
cbind(theta, varlogtheta, lbrr, ubrr)
## theta varlogtheta lbrr ubrr
## [1,] 0.744005 0.00687375 0.6324182 0.8752807
상대위험률과 마찬가지로 효과크기를 산출하기 위해 오즈비를 그대로 사용하지 않고 자연로그 변환값을 사용한다.
로그 변환후의 \(OR\)은 다음과 같다. \[ Log(OR_i)=log(\frac{ad}{bc}) \]
로그 변환후의 분산은 다음과 같다.
\(Log(OR)\)의 분산:
\[ Var(Log(RR_i))=\frac{1}{a}+\frac{1}{b}+\frac{1}{c}+\frac{1}{d} \] 따라서 \(Log(OR)\)의 신뢰구간은 다음과 같이 정의된다. \[ CI=Log(OR_i) \pm z_{\alpha/2}\times SE(Log(OR_i)) \] 오즈비(OR)에 대한 신뢰구간은 \(Log(OR)\)의 신뢰구간에 지수함수를 취해서 산출한다. \[ CI(OR)=exp(Log(OR_i) \pm z_{\alpha/2}\times SE(Log(OR_i))) \] 평균효과크기 산출을 위한 가중값 적용 방법은 역분산(Inverse variance) 방법과 Mantel-Haenszel (MH) 방법, Peto 방법이 사용되며 먼저 역분산 방법을 살펴보자.
역분산 방법에서 가중값 \(w\)는 \(Log(OR)\)의 분산의 역수로 정의된다. \[ w_i = \frac{1}{Var(Log(OR_i))} \] 따라서 로그변환 평균효과크기 \(Log(\theta)\)는 다음과 같다. \[ Log(\theta)=\frac{\sum_{i=1}^K w_i Log(OR_i)}{\sum_{i=1}^K w_i} \] 이에 \(Log(\theta)\)의 분산과 신뢰구간은 다음과 같다.
\(Log(\theta)\)의 분산 \[ Var(Log(\theta)) = \frac{1}{\sum_{i=1}^K w_i} \]
\(Log(\theta)\)의신뢰구간 \[ CI=Log(\theta) \pm z_{\alpha/2}\times SE(Log(\theta)) \]
따라서 오즈비의 평균효과크기와 신뢰구간은 다음과 같다.
\[ \theta=exp(Log(\theta))=exp(\frac{\sum_{i=1}^K w_i Log(OR_i)}{\sum_{i=1}^K w_i}) \]
\[ CI(\theta) = exp(Log(\theta)\pm z_{\alpha/2}\times SE(Log(\theta))) \]
MH 방법에서 가중값 \(w\)는 역분산 방법과 달리 효과크기 \(OR\)에 직접 정의된다. \[ w_i = \frac{bc}{n}, \,\,\,n=n_1+n_2 \]
따라서 평균효과크기 \(\theta\)는 다음과 같다. \[ \theta=\frac{\sum_{i=1}^K w_i OR_i}{\sum_{i=1}^K w_i} \] 반면, 평균효과크기 \(\theta\)의 분산은 직접적으로 구할 수 없어 \(Log(\theta)\)로 접근하며, 이에 \(Log(\theta)\)의 분산과 신뢰구간은 다음과 같다.
\(Log(\theta)\)의 분산 \[ Var(Log(\theta)) = \frac{\sum_{i=1}^K(bc/n)^2(\frac{1}{a}+\frac{1}{b}+\frac{1}{c}+\frac{1}{d})}{(\sum_{i=1}^K bc/n)^2} \]
\(Log(\theta)\)의신뢰구간 \[ CI=Log(\theta) \pm z_{\alpha/2}\times SE(Log(\theta)) \]
따라서 상대위험률의 신뢰구간은 다음과 같다.
\[ CI(\theta) = exp(Log(\theta)\pm z_{\alpha/2}\times SE(Log(\theta))) \]
Peto 방법은 로그변환 OR값을 정의하여 진행된다.
\[ Log(OR_i)=\frac{a-n_1(a+c)/n}{V}, \,\,\, V=\frac{n_1n_2(a+c)(b+c)}{n^2(n-1)} \]
따라서 OR값은 $Log(OR)값에 지수함수를 취하여 역산한다.
\(Log(OR)\)의 분산은 다음과 같다. \[ Var(Log(OR))=\frac{1}{V} \]
이후 효과크기 \(OR\)의 신뢰구간 및 평균효과크기, 평균효과크기의 신뢰구간을 구하는 방법은 역분산법을 이용하는 것과 같다. Peto 방법은 집단 크기가 같고 event 발생이 아주 드문(rate) 경우에 유용하다.
이분형 자료를 위한 연구에서 필요한 값은 각 집단의 표본크기(n1, n2)와 event 발생 횟수(e1, e2) 값이다. 여기서는 7개의 개별 연구의 값을 이용하여 pooled OR값을 산출해보자.
ordata <- read.table(text='
Study e1 n1 e2 n2
"Cai QM 2020" 70 85 117 223
"Cao J 2020" 14 17 34 85
"Chen T 2020" 30 131 30 161
"Du RH 2020" 10 51 8 58
"Guan W 2020" 38 135 120 666
"Zhang G 2020" 24 32 28 63
"Zhou F 2020" 26 54 33 135
', header=T)
ordata
## Study e1 n1 e2 n2
## 1 Cai QM 2020 70 85 117 223
## 2 Cao J 2020 14 17 34 85
## 3 Chen T 2020 30 131 30 161
## 4 Du RH 2020 10 51 8 58
## 5 Guan W 2020 38 135 120 666
## 6 Zhang G 2020 24 32 28 63
## 7 Zhou F 2020 26 54 33 135
### 변수의 객체화
attach(ordata)
## The following objects are masked from rrdata:
##
## e1, e2, n1, n2, Study
## The following objects are masked from cdata2:
##
## n1, n2
### 효과크기 RR
OR <- e1*(n2-e2)/e2/(n1-e1)
### 효과크기 로그변환
logOR <- log(OR)
### Log(OR)의 분산
var_logor <- 1/e1+1/(n1-e1)+1/e2+1/(n2-e2)
cbind(ordata, OR, logOR, var_logor)
## Study e1 n1 e2 n2 OR logOR var_logor
## 1 Cai QM 2020 70 85 117 223 4.227920 1.4417102 0.09893335
## 2 Cao J 2020 14 17 34 85 7.000000 1.9459101 0.45378151
## 3 Chen T 2020 30 131 30 161 1.297030 0.2600768 0.08420124
## 4 Du RH 2020 10 51 8 58 1.524390 0.4215945 0.26939024
## 5 Guan W 2020 38 135 120 666 1.782474 0.5780024 0.04678990
## 6 Zhang G 2020 24 32 28 63 3.750000 1.3217558 0.23095238
## 7 Zhou F 2020 26 54 33 135 2.870130 1.0543573 0.11428278
### Log(OR)의 신뢰구간
lower_logor <- logOR - qnorm(0.975)*sqrt(var_logor)
upper_logor <- logOR + qnorm(0.975)*sqrt(var_logor)
### 효과크기의 신뢰구간
lower_or = exp(lower_logor)
upper_or = exp(upper_logor)
### Log(OR)의 가중값 - Mantel Haenszel (MH)
w = (n1-e1)*e2/(n1+n2)
### 표준화 가중값
wp = w/sum(w)*100
data.frame(Study=ordata[,1], OR, lower_or, upper_or, wp)
## Study OR lower_or upper_or wp
## 1 Cai QM 2020 4.227920 2.2824046 7.831788 13.611333
## 2 Cao J 2020 7.000000 1.8693927 26.211722 2.388769
## 3 Chen T 2020 1.297030 0.7344343 2.290588 24.787574
## 4 Du RH 2020 1.524390 0.5511865 4.215933 7.188224
## 5 Guan W 2020 1.782474 1.1665412 2.723620 34.713205
## 6 Zhang G 2020 3.750000 1.4620595 9.618282 5.632467
## 7 Zhou F 2020 2.870130 1.4796078 5.567452 11.678429
### 평균효과크기 theta
theta = sum(w*OR)/sum(w)
### Log(theta)의 분산
varlogtheta = sum(((n1-e1)*e2/(n1+n2))^2*(1/e1+1/(n1-e1)+1/e2+1/(n2-e2)))/sum((n1-e1)*e2/(n1+n2))**2
### Log(theta)의 신뢰구간
lb = log(theta) - qnorm(0.975)*sqrt(varlogtheta)
ub = log(theta) + qnorm(0.975)*sqrt(varlogtheta)
### 오즈비 평균효과크기의 신뢰구간
lbor = exp(lb)
ubor = exp(ub)
cbind(theta, varlogtheta, lbor, ubor)
## theta varlogtheta lbor ubor
## [1,] 2.338926 0.0165869 1.817148 3.01053
이벤트 위험율 차이(risk difference, RD)는 실험집단과 통제집단의 event 발생 비율의 차이를 의미하는 단순한 개념이지만, 임상적인 맥락에서 이해하기란 쉽지 않다. 여기서 risk difference는 상대적 개념이 아니라 절대적 크기 차이를 의미하기 때문에 메타분석에서 사용되는 경우는 흔치 않다.
효과크기 RD의 정의는 다음과 같다. \[ RD=\frac{1}{n_1}-\frac{c}{n_2} \]
효과크기 RD 분산의 정의는 다음과 같다.
\[ Var(RD)=\frac{ab}{n_1^2(n_1-1)}+\frac{cd}{n_2^2(n_2-1)} \]
효과크기 RD의 Mantel-Haenszel 가중값은 다음과 같이 정의한다. \[ w_i=\frac{(a+b)(c+d)}{n}=\frac{n_1n_2}{n}, \,\,\, n=n_1+n_2 \] 또한 Mantel-Haenszel 평균효과크기는 다음과 같다.
\[ \theta=\frac{\sum_{i=1}^K an_2/n-cn_1/n}{\sum_{i=1}^K n_1n_2/n} \]
평균효과크기 \(\theta\)의 분산을 알경우 신뢰구간은 다음과 같다.
\[ CI=\theta \pm z_{\alpha/2}\sqrt{Var(\theta)} \]
위험율 차이는 절대적인 크기의 개념으로 인해 실제 메타분석에서 잘 쓰이지 않고 대신 NNT (number needed to treat; NNT)의 개념을 사용하기도 한다. NNT는 어떤 positive(+) Event가 발생할 케이스를 하나 더 추가하기 위해 필요한 (치료를 받아야 할) 케이스 수를 의미한다. 예를 들어, TB 예방을 위한 백신접종 연구에서 NNT=5이면 TB가 발생할 케이스를 하나 더 얻기 위해 5명의 케이스가 백신을 접종받아야 한다. 즉 NNT=1/RD, 곧 RD의 역수로서 RD가 작을수록 NNT는 커진다.
Time to event 자료의 경우 효과크기는 hazard ratio (HR)를 주로 이용하며, RR 및 OR과 마찬가지로 자연로그 변환값을 사용하여 효과크기에 대한 신뢰구간을 산출한다.
HR에 대한 평균효과크기를 구하기 위해 Log(HR)에 대한 SE값이 직접적으로 주어진 경우. 역분산법을 이용하여 평균효과크기를 직접적으로 추정할 수 있으며, HR에 대한 신뢰구간이 주어진 경우 이를 이용한 Log(HR)에 대한 분산은 다음과 같이 구할 수 있다(자세한 사항은 Tierney et al., 2007 참조).
신뢰구간을 이용한 Log(HR)의 분산은 다음과 같다. \[ Var(Log(HR_i))=(\frac{log(upperCI)-log(lowerCI)}{2\times z_{\alpha/2}})^2 \]
\(Log(HR)\)의 신뢰구간은 다음과 같이 정의된다. \[ CI=Log(HR_i) \pm z_{\alpha/2}\times SE(Log(HR_i)) \]
따라서 위험비(HR)에 대한 신뢰구간은 \(Log(HR)\)의 신뢰구간에 지수함수를 취해서 산출한다. \[ CI(HR)=exp(Log(HR_i) \pm z_{\alpha/2}\times SE(Log(HR_i))) \]
\(Log(HR)\)의 가중값 \(w\)는 \(Log(HR)\)의 분산의 역수로 정의된다. \[ w_i = \frac{1}{Var(Log(HR_i))} \]
따라서 로그변환 평균효과크기 \(Log(\theta)\)는 다음과 같다. \[ Log(\theta)=\frac{\sum_{i=1}^K w_i Log(HR_i)}{\sum_{i=1}^K w_i} \]
이에 \(Log(\theta)\)의 분산과 신뢰구간은 다음과 같다.
\(Log(\theta)\)의 분산 \[ Var(Log(\theta)) = \frac{1}{\sum_{i=1}^K w_i} \]
\(Log(\theta)\)의신뢰구간 \[ CI=Log(\theta) \pm z_{\alpha/2}\times SE(Log(\theta)) \]
따라서 위험비의 평균효과크기와 신뢰구간은 다음과 같다.
\[ \theta=exp(Log(\theta))=exp(\frac{\sum_{i=1}^K w_i Log(HR_i)}{\sum_{i=1}^K w_i}) \]
\[ CI(\theta) = exp(Log(\theta)\pm z_{\alpha/2}\times SE(Log(\theta))) \]
hrdata <- read.table(text='
study loghr se_loghr
APPROACH(2011) -0.1424 0.1166
Bonacchi(2006) -0.4055 0.6551
Buxton(1998) -0.3415 0.1256
Carrier_p(2009) -0.0781 0.162
Carrier_n(2009) -0.4368 0.1197
DiMauro(2005) -0.5306 0.2349
Endo(2001) -0.0502 0.1787
Glineur(2012) -0.298 0.1259
Grau(2012) -0.3955 0.1126
Joo(2012) -0.0125 0.2648
Kelly(2012) -0.2008 0.1004
Kinoshita(2012) -0.5906 0.2962
Kurlansky(2010) -0.1778 0.0426
Locker_only(2012) -0.2247 0.1904
Locker_RA(2012) -0.1434 0.2412
Locker_SV(2012) -0.312 0.1276
Lytle(2004) -0.2739 0.0704
Navia(2013) -0.0194 0.343
Parsa(2013) -0.0547 0.067
Pick(1997) -0.2002 0.2489
Puskas(2012) -0.4309 0.1546
Stevens(2004) -0.3081 0.1034
Toumpoulis(2006) -0.12 0.1281
', header=T)
hrdata
## study loghr se_loghr
## 1 APPROACH(2011) -0.1424 0.1166
## 2 Bonacchi(2006) -0.4055 0.6551
## 3 Buxton(1998) -0.3415 0.1256
## 4 Carrier_p(2009) -0.0781 0.1620
## 5 Carrier_n(2009) -0.4368 0.1197
## 6 DiMauro(2005) -0.5306 0.2349
## 7 Endo(2001) -0.0502 0.1787
## 8 Glineur(2012) -0.2980 0.1259
## 9 Grau(2012) -0.3955 0.1126
## 10 Joo(2012) -0.0125 0.2648
## 11 Kelly(2012) -0.2008 0.1004
## 12 Kinoshita(2012) -0.5906 0.2962
## 13 Kurlansky(2010) -0.1778 0.0426
## 14 Locker_only(2012) -0.2247 0.1904
## 15 Locker_RA(2012) -0.1434 0.2412
## 16 Locker_SV(2012) -0.3120 0.1276
## 17 Lytle(2004) -0.2739 0.0704
## 18 Navia(2013) -0.0194 0.3430
## 19 Parsa(2013) -0.0547 0.0670
## 20 Pick(1997) -0.2002 0.2489
## 21 Puskas(2012) -0.4309 0.1546
## 22 Stevens(2004) -0.3081 0.1034
## 23 Toumpoulis(2006) -0.1200 0.1281
attach(hrdata)
## The following object is masked from cdata2:
##
## study
### 효과크기 HR
HR <- exp(loghr)
### Log(HR)의 분산
var_loghr <- se_loghr^2
cbind(hrdata, HR, var_loghr)
## study loghr se_loghr HR var_loghr
## 1 APPROACH(2011) -0.1424 0.1166 0.8672743 0.01359556
## 2 Bonacchi(2006) -0.4055 0.6551 0.6666434 0.42915601
## 3 Buxton(1998) -0.3415 0.1256 0.7107035 0.01577536
## 4 Carrier_p(2009) -0.0781 0.1620 0.9248719 0.02624400
## 5 Carrier_n(2009) -0.4368 0.1197 0.6461006 0.01432809
## 6 DiMauro(2005) -0.5306 0.2349 0.5882519 0.05517801
## 7 Endo(2001) -0.0502 0.1787 0.9510392 0.03193369
## 8 Glineur(2012) -0.2980 0.1259 0.7423013 0.01585081
## 9 Grau(2012) -0.3955 0.1126 0.6733433 0.01267876
## 10 Joo(2012) -0.0125 0.2648 0.9875778 0.07011904
## 11 Kelly(2012) -0.2008 0.1004 0.8180760 0.01008016
## 12 Kinoshita(2012) -0.5906 0.2962 0.5539948 0.08773444
## 13 Kurlansky(2010) -0.1778 0.0426 0.8371098 0.00181476
## 14 Locker_only(2012) -0.2247 0.1904 0.7987558 0.03625216
## 15 Locker_RA(2012) -0.1434 0.2412 0.8664074 0.05817744
## 16 Locker_SV(2012) -0.3120 0.1276 0.7319815 0.01628176
## 17 Lytle(2004) -0.2739 0.0704 0.7604081 0.00495616
## 18 Navia(2013) -0.0194 0.3430 0.9807870 0.11764900
## 19 Parsa(2013) -0.0547 0.0670 0.9467691 0.00448900
## 20 Pick(1997) -0.2002 0.2489 0.8185670 0.06195121
## 21 Puskas(2012) -0.4309 0.1546 0.6499239 0.02390116
## 22 Stevens(2004) -0.3081 0.1034 0.7348418 0.01069156
## 23 Toumpoulis(2006) -0.1200 0.1281 0.8869204 0.01640961
### Log(RR)의 신뢰구간
lower_loghr <- loghr - qnorm(0.975)*se_loghr
upper_loghr <- loghr + qnorm(0.975)*se_loghr
### 원 자료의 신뢰구간
lower_hr <- exp(lower_loghr)
upper_hr <- exp(upper_loghr)
### Log(RR)의 가중값 - Mantel Haenszel (MH)
w <- 1/var_loghr
wp <- w/sum(w)*100
data.frame(Study=hrdata[,1], HR, lower_hr, upper_hr, wp)
## Study HR lower_hr upper_hr wp
## 1 APPROACH(2011) 0.8672743 0.6900910 1.0899500 3.9414529
## 2 Bonacchi(2006) 0.6666434 0.1846169 2.4072196 0.1248643
## 3 Buxton(1998) 0.7107035 0.5556196 0.9090742 3.3968327
## 4 Carrier_p(2009) 0.9248719 0.6732664 1.2705046 2.0418480
## 5 Carrier_n(2009) 0.6461006 0.5109888 0.8169378 3.7399444
## 6 DiMauro(2005) 0.5882519 0.3712070 0.9322032 0.9711524
## 7 Endo(2001) 0.9510392 0.6700214 1.3499203 1.6780478
## 8 Glineur(2012) 0.7423013 0.5799813 0.9500501 3.3806638
## 9 Grau(2012) 0.6733433 0.5399969 0.8396182 4.2264590
## 10 Joo(2012) 0.9875778 0.5877236 1.6594703 0.7642184
## 11 Kelly(2012) 0.8180760 0.6719439 0.9959885 5.3160128
## 12 Kinoshita(2012) 0.5539948 0.3100129 0.9899918 0.6107779
## 13 Kurlansky(2010) 0.8371098 0.7700541 0.9100047 29.5280144
## 14 Locker_only(2012) 0.7987558 0.5499779 1.1600663 1.4781536
## 15 Locker_RA(2012) 0.8664074 0.5400231 1.3900550 0.9210831
## 16 Locker_SV(2012) 0.7319815 0.5700157 0.9399688 3.2911835
## 17 Lytle(2004) 0.7604081 0.6624028 0.8729137 10.8120520
## 18 Navia(2013) 0.9807870 0.5007403 1.9210418 0.4554757
## 19 Parsa(2013) 0.9467691 0.8302590 1.0796291 11.9372376
## 20 Pick(1997) 0.8185670 0.5025626 1.3332706 0.8649752
## 21 Puskas(2012) 0.6499239 0.4800282 0.8799505 2.2419941
## 22 Stevens(2004) 0.7348418 0.6000392 0.8999287 5.0120150
## 23 Toumpoulis(2006) 0.8869204 0.6899947 1.1400492 3.2655413
### 평균효과크기 Log(theta)
logtheta = sum(w*loghr)/sum(w)
### Log(theta)의 분산
varlogtheta = 1/sum(w)
### Log(theta)의 신뢰구간
lb = logtheta - qnorm(0.975)*sqrt(varlogtheta)
ub = logtheta + qnorm(0.975)*sqrt(varlogtheta)
### 위험비 평균효과크기의 신뢰구간
theta = exp(logtheta)
lbrr = exp(lb)
ubrr = exp(ub)
cbind(theta, varlogtheta, lbrr, ubrr)
## theta varlogtheta lbrr ubrr
## [1,] 0.8047614 0.0005358626 0.7690648 0.8421149
효과크기 계산에 있어서 상관관계 자료는 계산이 가장 용이한 자료이다. 상관관계 자료(correlational data)인 경우 효과크기를 계산하는 공식은 다음과 같다. 여기서 피셔의 상관계수(Fisher’s \(Z\))가 상관계수 \(r\)보다 정규분포를 더 따르기 때문에 Fisher’s \(Z\)로 전환하여 사용한다.
Fisher’s \(Z\):
\[ Z=0.5\times ln(\frac{1+r}{1-r}) \]
Fisheer’s \(Z\) 분산:
\[ Var(Z)=\frac{1}{n-3}, \quad SE(Z)=\sqrt{Var(Z)} \]
반대로 Fisher’s \(Z\)를 상관계수 \(r\)로 전환하는 식은 다음과 같다.
상관계수 \(r\):
\[ r=\frac{e^{2Z}-1}{e^{2Z}+1} \] \(r\)의 분산:
\[
Var(r)=\frac{(1-r^2)^2}{n-1}
\]
다양한 유형의 자료로부터 계산된 효과크기는 아래 그림과 같이 상호 전환이 가능하며, 그 공식은 다음과 같다(Borenstein et al., 2009).
표준화된 평균 차이(\(d\))에서 로그승산비(log odds ratio)로 전환방법은 다음과 같다.
\[ Log(OR)=d\frac{\pi}{\sqrt{3}} \] \[ Var(log(OR))=Var(d)\frac{\pi^2}{3} \]
로그승산비에서 표준화된 평균 차이로 전환하는 방법은 다음과 같다.
\[ d=log(OR)\frac{\sqrt{3}}{\pi} \] \[ Var(d)=Var(log(OR))\frac{3}{\pi^2} \]
상관계수(\(r\))에서 표준화된 평균 차이(\(d\))로 전환하는 방법은 다음과 같다.
\[ d=\frac{2r}{\sqrt{1-r^2}} \] \[ Var(d)=\frac{4Var(r)}{(1-r^2)^3} \]
표준화된 평균 차이(\(d\))에서 상관계수(\(r\))로 전환하는 경우 공식은 다음과 같다.
\[ r=\frac{d}{\sqrt{d^2+a}} \] 만약, \(n_1 \ne n_2\)이면 교정지수 \(a\)는
\[ a=\frac{(n_1+n_2)^2}{n_1n_2} \] 만약, \(n_1\)과 \(n_2\)를 정확히 알 수 없다면 \(n_1=n_2\)라고 가정하고 \(a=4\)를 이용한다
\[ Var(r)=\frac{a^2Var(d)}{(d^2+a)^3} \]
메타분석에서 고정효과모형(fixed effect model)과 랜덤효과모형(random effet model)은 실제 효과크기(true effect size)를 어떻게 가정하느냐에 따라 달라진다. 즉 연구자가 평균효과크기를 계산할 때 두 가지 방법 중 어떤 방법을 선택해서 계산하느냐에 따라 평균효과크기의 추정값이 달라지고 그에 따라 평균효과크기의 정밀성(precision)도 달라진다.
| 고정효과모형 | 랜덤효과모형 |
|---|---|
| 가정: 모든 연구의 모집단 효과크기는 동일하다. (모집단 효과크기의 동질성) | 가정: 각 연구는 대상자, 개입방법, 기간 등이 서로 다르기 때문에 개별 연구의 모집단 효과크기는 서로 다르다. (모집단 효과크기의 이질성) |
| 목적: 동일한 모집단의 효과, 즉 one true effect (common effect)를 추정한다. | 목적: 서로 상이한 모집단의 효과크기 분포의 평균을 추정한다. |
| 각 연구의 효과크기 차이는 표본오차(sampling error)에 기인한다. | 각 연구의 효과크기 차이는 표본오차와 연구 간 분산(between-study variance)으로 구성된다. |
| 평균효과크기는 각 연구의 동일한 모집단 효과크기를 추정한 값이다. | 평균효과크기는 각 연구의 서로 상이한 모집단 효과크기 분포의 추정 평균값이다. |
| 표본크기가 커지면 표준오차는 0에 가까워진다. | 표본크기가 크고 동시에 연구의 규모도 커지면 표준오차는 0에 가까워진다. |
고정효과모형과 랜덤효과모형을 그림으로 설명하면 다음과 같다.
고정효과모형: 관찰된 효과크기는 실제(true) 하나의 효과 크기 \(\theta\)로 부터 발생하고 표본오차(sampling error)에 의해서만 차이가 발생한다고 가정한다. 이를 표현하면 다음과 같다.
\[ \theta_k = \theta + \epsilon_k \]
랜덤효과모형: 랜덤효과모형은 고정효과모형에서 가정하는 표본오차(\(\epsilon_k\)) 외에도 연구 간 발생하는 실제 효과크기의 분포를 고려하고, 때문에 연구 간 실제 효과크기가 서로 다를 수 있음을 가정한다. 이를 \(\zeta_k\)로 표현하고 관측된 \(\theta_k\)는 다음과 같이 표현된다.
\[ \theta_k=\mu+\epsilon_k +\zeta_k \]
여기서 circle은 모집단 효과크기이며 square는 관찰된 효과크기를 의미한다.
그림에서 보는 것처럼 고정효과모형은 각 연구 간 관찰된 효과크기는 서로 다르지만 추정하고자 하는 모집단의 효과크기는 동일하다. 즉 연구 간 효과크기가 서로 다른것은 표본오차에 의한 것이다. 반면 랜덤효과모형은 각 연구 간 관찰된 효과크기가 서로 다르며 추정하고자 하는 모집단의 효과크기도 각각 다르다. 이것은 표본오차에 의한 차이, 즉 연구 내 분산(within-study variance) 뿐 아니라 연구 간 분산(between-study variance)이 존재하기 때문이다.
고정효과모형과 랜덤효과모형의 차이점은 다음과 같다.
| 고정효과모형 | 랜덤효과모형 |
|---|---|
| 각 연구들이 기능적으로 동일(identical)하다. | 각 연구들의 표본, 개입방법 등이 서로 다르다. |
| 효과크기의 동질성(homogeneity of effect)을 가정한다. 따라서 각 연구의 연구 간 분산은 0으로 고정한다. | 효과크기의 이질성(heterogenety of effect)을 가정하고 연구 간 분산을 인정한다. |
| 각 연구의 가중값은 매우 다르다. | 가중값이 보다 균형적이고 표준오차가 크다. 따라서 신뢰구간이 더 길다. |
| 기능적으로 동일한 연구이며, 연구 결과의 적용을 일반화하기보다는 특정 집단에 한정하고자 하는 경우 사용한다. | 각 연구는 연구자들에 의해 독립적으로 이루어진 것이며, 연구 결과를 다른 집단에도 일반화하여 적용하고자 하는 경우에 사용한다. |
고정효과모형의 적용 과정을 살펴보기 위해 표준화 평균차를 기준으로 살펴보자. 표준화 평균차 \(d_i\)와 그 분산은 다음과 같다.
\[ d_i = \frac{\bar{X_1}-\bar{X_2}}{S_p} \]
여기서 \(S_p\)는 합동표준편차를 의미하며, \(S_p\)는 다음과 같다.
\[ S_p = \sqrt{\frac{(n_1 -1)S_1^2 + (n_2-1)S_2^2}{n_1+n_2-2}} \]
개별 연구의 표준화 평균차 \(d_i\)의 분산은 다음과 같이 정의한다.
\[
Var(d_i)=\frac{1}{n_1}+\frac{1}{n_2}+\frac{d_i^2}{2(n_1+n_2)}=\frac{n_1+n_2}{n_1n_2}+\frac{d_i^2}{2(n_1+n_2)}
\]
\[ g_i = J \times d_i, \,\,\, J=1-\frac{3}{4(n_1+n_2)-9} \]
\(g_i\)의 분산은 다음과 같다.
\[ Var(g_i)=J^2\times Var(d_i) \]
따라서 보정된 표준화 평균차의 신뢰구간은 다음과 같다.
\[ CI(g_i)=g_i \pm z_{\alpha/2}\times SE(g_i), \quad SE(g_i)=\sqrt{Var(g_i)} \]
고정효과모형의 평균효과크기와 분산은 다음과 같다.
평균효과크기 \(M\): \[ M = \frac{\sum_{i=1}^K w_ig_i}{\sum_{i=1}^K w_i} \]
여기서 \(w_i=\frac{1}{Var(g_i)}\)이다.
\[Var(M) = \frac{1}{\sum_{i=1}^K w_i}, \quad SE(M)=\sqrt{V_M}\]
이때, 귀무가설 \(H_0: M=0\) 하에서 검정통계량은
\[Z=\frac{M}{SE(M)}\]
이며, 신뢰구간은 다음과 같다.
\[CI=(M-z_{\alpha/2}\times SE(M),\,\,\, M+z_{\alpha/2}\times SE(M))\]
랜덤효과모형은 고정효과모형과 기본적인 과정에서 차이가 없으며, 다만 평균효과크기를 추정 할 때 적용되는 분산이 달라진다. 랜덤효과모형의 적용 과정을 살펴보기 위해 고정효과모형과 같이 표준화 평균 차를 기준으로 살펴보자. 표준화 평균차 \(d_i\)와 분산은 다음과 같다.
표준화된 평균 차이: \[ d_i = \frac{\bar{X_1}-\bar{X_2}}{S_p} \]
여기서 \(S_p\)는 합동표준편차를 의미하며, \(S_p\)는 다음과 같다.
\[ S_p = \sqrt{\frac{(n_1 -1)S_1^2 + (n_2-1)S_2^2}{n_1+n_2-2}} \]
개별 연구의 표준화된 평균 차이 \(d_i\)의 분산은 다음과 같이 정의한다.
\[
Var(d_i)=\frac{1}{n_1}+\frac{1}{n_2}+\frac{d_i^2}{2(n_1+n_2)}=\frac{n_1+n_2}{n_1n_2}+\frac{d_i^2}{2(n_1+n_2)}
\]
교정된 표준화된 평균 차이
\[ g_i = J \times d, \,\,\, J=1-\frac{3}{4(n_1+n_2)-9} \]
\(g_i\)의 분산은 다음과 같다.
\[ Var(g_i)=J^2\times Var(d_i) \]
따라서 교정된 표준화된 평균 차이의 신뢰구간은 다음과 같다.
\[ CI(g_i)=g_i \pm z_{\alpha/2}\times SE(g_i), \quad SE(g_i)=\sqrt{Var(g_i)} \]
랜덤효과모형의 평균효과크기와 분산은 다음과 같다.
\[ M = \frac{\sum_{i=1}^K w_ig_i}{\sum_{i=1}^K w_i} \]
여기서, \(w_i=\frac{1}{Var(g_i)*}\)이며 \(Var(g_i)*\)는 \(Var(g_i)*=Var(g_i)+\tau^2\)이다.
연구 간 분산을 의미하는 \(\tau^2\)은 다음과 같이 정의한다.
\[ \tau^2=\frac{Q-df}{C}, \quad df=K-1 \]
여기서, \(Q=\sum_{i=1}^K w_ig_i^2 - \frac{(\sum_{i=1}^K w_ig_i)^2}{\sum_{i=1}^Kw_i}\), \(C=\sum_{i=1}^K w_i - \frac{\sum_{i=1}^K w_i^2}{\sum_{i=1}^K w_i}\)이다.
평균효과크기 \(M\)의 분산과 표준오차:
\[Var(M) = \frac{1}{\sum_{i=1}^K w_i}, \quad SE(M)=\sqrt{Var(M)}\]
이때, 귀무가설 \(H_0: M=0\) 하에서 검정통계량은
\[Z=\frac{M}{SE(M)}\]
이며, 신뢰구간은 다음과 같다.
\[CI=(M-z_{\alpha/2}\times SE(M), M+z_{\alpha/2}\times SE(M))\]
따라서 고정효과모형과 랜덤효과모형에서 평균효과크기를 계산할때 차이점은 랜덤효과모형의 가중값 산출시 연구 간 분산 \(\tau^2\)이 더해지며 이로 인해 가중평균, 분산, 신뢰구간의 크기가 달라지게 된다.
두 집단간 비교연구에서 필요한 값은 각 집단의 표본크기(n1, n2), 평균(m1, m2), 표준편차(s1, s2) 값이다. 여기서는 10개의 개별 연구의 값을 입력한다.
random <- read.table(text='
Study m1 s1 n1 m2 s2 n2
Wang,R 0.74 0.3111 25 1.11 0.4 100
Feng,Y 0.82 0.437 70 1.13 0.5481 352
Cai,Q 0.98 0.4 58 1.34 0.6148 240
Wan,S 0.8 0.2963 40 1.2 0.5926 95
Ki,K 0.7 0.3778 25 1.23 0.363 58
Zheng,F 0.85 0.2741 30 1.12 0.4519 131
Guan,W 0.8 0.2963 153 1 0.4444 726
Zhang,J 0.7 0.3704 56 0.8 0.4444 82
Wang,D 0.8 0.2963 36 0.9 0.4444 102
Mao,L 0.9 1.8519 88 1.3 1.6296 126
Qin,C 0.8 0.3704 286 1 0.4444 166
Yun,L 0.78 0.4148 21 1.14 0.4741 271
', header=T)
random
## Study m1 s1 n1 m2 s2 n2
## 1 Wang,R 0.74 0.3111 25 1.11 0.4000 100
## 2 Feng,Y 0.82 0.4370 70 1.13 0.5481 352
## 3 Cai,Q 0.98 0.4000 58 1.34 0.6148 240
## 4 Wan,S 0.80 0.2963 40 1.20 0.5926 95
## 5 Ki,K 0.70 0.3778 25 1.23 0.3630 58
## 6 Zheng,F 0.85 0.2741 30 1.12 0.4519 131
## 7 Guan,W 0.80 0.2963 153 1.00 0.4444 726
## 8 Zhang,J 0.70 0.3704 56 0.80 0.4444 82
## 9 Wang,D 0.80 0.2963 36 0.90 0.4444 102
## 10 Mao,L 0.90 1.8519 88 1.30 1.6296 126
## 11 Qin,C 0.80 0.3704 286 1.00 0.4444 166
## 12 Yun,L 0.78 0.4148 21 1.14 0.4741 271
attach(random)
## The following objects are masked from ordata:
##
## n1, n2, Study
## The following objects are masked from rrdata:
##
## n1, n2, Study
## The following objects are masked from cdata2:
##
## m1, m2, n1, n2, s1, s2
### 합동분산추정량
sp2 <- ((n1-1)*s1^2 + (n2-1)*s2^2)/(n1+n2-2)
### 표준오차
sp <- sqrt(sp2)
### 표준화 평균차
d <- (m1 - m2)/sp
cbind(random,sp,d)
## Study m1 s1 n1 m2 s2 n2 sp d
## 1 Wang,R 0.74 0.3111 25 1.11 0.4000 100 0.3842721 -0.9628595
## 2 Feng,Y 0.82 0.4370 70 1.13 0.5481 352 0.5314447 -0.5833157
## 3 Cai,Q 0.98 0.4000 58 1.34 0.6148 240 0.5796580 -0.6210559
## 4 Wan,S 0.80 0.2963 40 1.20 0.5926 95 0.5233954 -0.7642406
## 5 Ki,K 0.70 0.3778 25 1.23 0.3630 58 0.3674473 -1.4423836
## 6 Zheng,F 0.85 0.2741 30 1.12 0.4519 131 0.4250532 -0.6352146
## 7 Guan,W 0.80 0.2963 153 1.00 0.4444 726 0.4224675 -0.4734092
## 8 Zhang,J 0.70 0.3704 56 0.80 0.4444 82 0.4160616 -0.2403490
## 9 Wang,D 0.80 0.2963 36 0.90 0.4444 102 0.4114126 -0.2430650
## 10 Mao,L 0.90 1.8519 88 1.30 1.6296 126 1.7242977 -0.2319785
## 11 Qin,C 0.80 0.3704 286 1.00 0.4444 166 0.3991296 -0.5010904
## 12 Yun,L 0.78 0.4148 21 1.14 0.4741 271 0.4702505 -0.7655495
### d의 분산
vard <- 1/n1+1/n2+d^2/(2*(n1+n2))
### D의 표준오차
sed <- sqrt(vard)
### 보정된 표준화 평균차 Hedges' g
J <- (1-3/(4*(n1+n2)-9))
g <- d * J
### g의 분산과 표준오차
varg <- J^2*vard; seg <- sqrt(varg)
### 신뢰 하한
lbg <- g - qnorm(0.975)*seg
### 신뢰 상한
ubg <- g + qnorm(0.975)*seg
data.frame(study=random[,1],g,varg,lbg,ubg)
## study g varg lbg ubg
## 1 Wang,R -0.9569764 0.053054084 -1.4084242 -0.5055287
## 2 Feng,Y -0.5822734 0.017467184 -0.8413091 -0.3232378
## 3 Cai,Q -0.6194810 0.021943492 -0.9098170 -0.3291449
## 4 Wan,S -0.7599229 0.037264848 -1.1382764 -0.3815694
## 5 Ki,K -1.4289868 0.068484235 -1.9418994 -0.9160742
## 6 Zheng,F -0.6322136 0.041822032 -1.0330348 -0.2313924
## 7 Guan,W -0.4730043 0.008027091 -0.6486053 -0.2974032
## 8 Zhang,J -0.2390211 0.029928110 -0.5780898 0.1000476
## 9 Wang,D -0.2417221 0.037379280 -0.6206561 0.1372119
## 10 Mao,L -0.2311569 0.019288512 -0.5033627 0.0410490
## 11 Qin,C -0.5002548 0.009765704 -0.6939415 -0.3065681
## 12 Yun,L -0.7635679 0.052042157 -1.2106896 -0.3164462
### w
w <- 1/varg
### Q
Q = sum(w*g^2)-(sum(w*g))^2/sum(w)
### C
C = sum(w) - sum(w^2)/sum(w)
### tau
df = dim(random)[1]-1
tau2 = (Q - df)/C
### 가중값
wg <- 1/(varg+tau2)
### 가중값 표준화
wpg <- wg/sum(wg)*100
data.frame(study=random[,1],g,varg,wg,wpg)
## study g varg wg wpg
## 1 Wang,R -0.9569764 0.053054084 11.088777 6.070777
## 2 Feng,Y -0.5822734 0.017467184 18.316908 10.027964
## 3 Cai,Q -0.6194810 0.021943492 16.928874 9.268056
## 4 Wan,S -0.7599229 0.037264848 13.442300 7.359261
## 5 Ki,K -1.4289868 0.068484235 9.468673 5.183818
## 6 Zheng,F -0.6322136 0.041822032 12.666370 6.934462
## 7 Guan,W -0.4730043 0.008027091 22.146298 12.124441
## 8 Zhang,J -0.2390211 0.029928110 14.913066 8.164461
## 9 Wang,D -0.2417221 0.037379280 13.421654 7.347958
## 10 Mao,L -0.2311569 0.019288512 17.725564 9.704220
## 11 Qin,C -0.5002548 0.009765704 21.325196 11.674912
## 12 Yun,L -0.7635679 0.052042157 11.214617 6.139670
### 평균효과크기
Mg <- sum(wg*g)/sum(wg)
### 평균효과크기의 분산
varMg <- 1/sum(wg)
### 평균효과크기의 표준오차
seMg <- sqrt(varMg)
### 평균효과크기의 신뢰구간
lbg <- Mg - qnorm(0.975)*seMg
ubg <- Mg + qnorm(0.975)*seMg
data.frame(Mg, varMg, seMg, lbg, ubg)
## Mg varMg seMg lbg ubg
## 1 -0.5700837 0.005474703 0.07399124 -0.7151038 -0.4250635
메타분석의 목표는 단순히 효과크기의 평균을 도출하는데 있지 않고 효과크기의 전체 패턴(pattern of effect sizes)을 이해하는 데 있다. 일반적으로 메타분석을 하게 되면 각 개별 연구로부터 도출된 추정된 모집단의 효과크기는 서로 다르게 나타나게 되는데, 이러한 효과크기간의 차이(differnces in effect sizes)를 효과크기의 이질성(heterogeneity)이라고 부른다. 즉 효과크기의 이질성은 각 연구로부터 나타난 효과크기의 분포(dispersion of effect sizes) 정도를 의미하며, 연구 간 효과크기가 일관되지 않은 정도를 의미한다(inconsistency across studies).
메타분석에서 이질성을 평가하는 것은 매우 중요하다. 실제 효과가 다른 두 개 이상의 연구가 하위 그룹으로 존재하기 때문에 높은 이질성이 발생할 수 있다. 이러한 정보는 연구에 매우 유용하게 쓰일 수 있다. 왜냐하면 이를 통해 효과가 더 낮거나 더 높은 특정 중재나 집단을 찾을 수 있기 때문이다. 통계적 관점에서도 높은 이질성은 문제가 되며, 특히 매우 높은 이질성은 연구에 공통점이 없음을 뜻하고 “실제” 진정한 효과가 없음을 의미 할 수 있다. 즉, 합동 효과를 보고하는 것 자체가 전혀 의미 없을 수도 있다 (Borenstein et al. 2011).
* A practical guide to meta-analysis (Chung et al., 2006)
메타분석에서 발생하는 효과크기 이질성은 크게 세가지 유형으로 구분된다.
임상적 이질성: 연구의 표본 간 특성 차이로 발생한다. 예를 들어, 한 연구는 노인을 대상으로 한 연구이고 다른 연구는 대부분 아주 어린 연구 참가자를 모집한 경우 연구간 표본 차이로 인한 이질성이 발생한다.
통계적 이질성: 수집 된 효과크기 자료에서 발생하는 통계적 이질성을 의미한다. 이러한 이질성은 임상적 관점(예: 연구마다 효과가 크게 다르기 때문에 치료가 매우 또는 미미하게 효과가 있는지 알 수 없는 경우) 또는 통계적 관점 (이질성으로 인해 pooled 효과크기의 신뢰도에 대한 문제)에서 중요하게 작용한다.
기타 다른 이질성(예: 연구 디자인과 관련된 이질성)
임상적 이질성과 기타 이질성은 개별 연구 검색 시 잘 정의된 중재 유형, 모집단 및 그 결과로 제한함으로써 어느 정도 통제할 수 있다.
각 연구로부터 도출된 결과, 즉 효과크기의 이질성의 정도를 나타내는 통계량(heterogeneity statistics)으로 활용되는 것으로 Cochran’s \(Q\), \(\tau^2\)과 \(I^2\) 세 가지가 있다. \(\tau^2\)과 \(I^2\)을 이해하고 계산하기 위해서는 먼저 효과크기의 동질성 검정(test of homogeneity)에 사용되는 \(Q\)값과 \(df\)를 이해해야 한다.
\(Q\)값은 메타분석에 있어서 각 효과크기들의 관찰된 분산(observed weighted sum of squares)을 의미하며, 이는 표본분산과 실제 연구 간 분산(true variance)을 모두 포함하는 총분산(total variance)을 의미하며, 다음과 같이 정의한다.
\[ Q=\sum_{i=1}^K w_ig_i^2 - \frac{(\sum_{i=1}^K w_ig_i)^2}{\sum_{i=1}^Kw_i} \]
\(Q\) 통계량은 효과크기의 동질성(homogeneity)을 검정하는데 사용되지만, 귀무가설을 검정할 뿐이며, 그 분포자체는 \(\chi^2\) 분포를 따르기 때문에 자유도(\(df\)), 즉 메타분석에 포함된 연구 수(\(K\))에 많은 영향을 받게 된다.
한편, \(df\)(자유도)는 각 연구의 모집단의 효과크기가 모두 동일하다고 가정할 때 기대하는 기대분산 값이다. 따라서 총분산-기대분산=실제분산 이므로 \(Q-df\)는 실제 연구 간 효과 차이로 인한 분산의 정도를 의미한다. 하지만 이 값은 총분산에서 기대분산을 제외한 값으로 절대값을 나타내는 것은 아니다. 따라서 비교가능성을 위해 표준화한 형태인 \(\tau^2\)을 정의한다. 일반적으로 \(\tau^2\)이 0보다 크면 연구 간 이질성이 존재하게 되며 0(또는 <0)인 경우에는 연구간 이질성이 없기때문에 고정효과모형과 랜덤효과모형의 결과가 동일하게 나타난다.
효과크기의 이질성을 나타내는 다른 지수로는 Higgin’s & Thompson’s \(I^2\)이 있으며 정의는 다음과 같다.
\[ I^2=max(0, \frac{Q-df}{Q}\times 100\%) \]
이는 총분산에 대한 실제분산의 비율을 나타내며, \(\tau^2\)과 달리 절대값이 아니라 비율(\(\%\))로 나타난다. 즉, 총분산 대비 실제 연구 간 분산의 비율을 표현한다. 일반적으로 \(I^2\)이 \(25\%\) 내외이면 이질성이 작은 것으로 해석하며, \(50\%\)이면 중간 크기 정도로, 그리고 \(70\%\) 이상이면 이질성이 매우 큰 것으로 해석하게 된다. 따라서 \(I^2>50\%\)이면 연구 간 이질성이 존재 할 가능성이 크다고 볼 수 있다.
R 실습을 위해 “Crucial laboratory parameters in COVID-19 diagnosis and prognosis: An updated meta-analysis (Soraya and Ulhaq, 2020)” 논문에 명시된 자료를 이용하고 R-package meta를 사용한다.
우선 R-package meta를 install하고 R에서 사용가능하게 meta package를 loading 한다.
# install.packages("meta")
library(meta)
## Loading 'meta' package (version 4.18-1).
## Type 'help(meta)' for a brief overview.
heteroc <- read.table(text='
Study m1 s1 n1 m2 s2 n2
"Cao et al(1)" 4.48 2.22 19 4.7 1.55 174
"Cao et al(2)" 11.85 5.35 21 6.57 4.98 107
"Gao et al" 4.26 1.85 15 4.96 1.85 28
"Guan et al" 3.7 2.37 173 4.9 1.62 926
"Huang et al" 11.3 4.67 13 5.7 3.33 28
"Li et al" 5.5 2.67 25 5.27 1.55 58
"Liu et al(1)" 5.7 5.33 7 5.2 2.59 44
"Liu et al(2)" 6.08 2.56 11 5.18 1.63 67
"Lo et al" 5.57 1.99 4 4.51 1.18 6
"Mao et al" 5.4 15.03 88 4.5 9.03 126
"Qian et al" 5.23 1.52 9 4.97 1.2 82
"Qin et al" 5.6 303 286 4.9 1.77 166
"Ruan et al" 10.52 4.76 68 6.76 3.49 82
"Song et al" 6.6 5.25 42 4.2 1.85 31
"Wang et al(1)" 4.8 7.18 37 4.6 10.66 205
"Wang et al(2)" 6.6 4.59 36 4.3 1.55 102
"Yang et al" 0.62 0.37 32 0.74 0.4 20
"Young et al" 3.4 2.37 6 4.6 3.41 12
"Yudong et al" 5.53 3.34 16 5.78 2.76 96
"Zhang et al(1)" 5.3 3.7 56 4.5 1.78 82
"Zhang et al(2)" 6.2 3.92 55 4.1 2 166
"Zhang et al(3)" 6.21 3.22 3 4.28 0.82 9
"Zhou et al" 9.8 5.18 54 5.2 2.51 137
"Zhu et al" 7.8 4.13 43 6.4 2.92 71
', header=T)
heteroc
## Study m1 s1 n1 m2 s2 n2
## 1 Cao et al(1) 4.48 2.22 19 4.70 1.55 174
## 2 Cao et al(2) 11.85 5.35 21 6.57 4.98 107
## 3 Gao et al 4.26 1.85 15 4.96 1.85 28
## 4 Guan et al 3.70 2.37 173 4.90 1.62 926
## 5 Huang et al 11.30 4.67 13 5.70 3.33 28
## 6 Li et al 5.50 2.67 25 5.27 1.55 58
## 7 Liu et al(1) 5.70 5.33 7 5.20 2.59 44
## 8 Liu et al(2) 6.08 2.56 11 5.18 1.63 67
## 9 Lo et al 5.57 1.99 4 4.51 1.18 6
## 10 Mao et al 5.40 15.03 88 4.50 9.03 126
## 11 Qian et al 5.23 1.52 9 4.97 1.20 82
## 12 Qin et al 5.60 303.00 286 4.90 1.77 166
## 13 Ruan et al 10.52 4.76 68 6.76 3.49 82
## 14 Song et al 6.60 5.25 42 4.20 1.85 31
## 15 Wang et al(1) 4.80 7.18 37 4.60 10.66 205
## 16 Wang et al(2) 6.60 4.59 36 4.30 1.55 102
## 17 Yang et al 0.62 0.37 32 0.74 0.40 20
## 18 Young et al 3.40 2.37 6 4.60 3.41 12
## 19 Yudong et al 5.53 3.34 16 5.78 2.76 96
## 20 Zhang et al(1) 5.30 3.70 56 4.50 1.78 82
## 21 Zhang et al(2) 6.20 3.92 55 4.10 2.00 166
## 22 Zhang et al(3) 6.21 3.22 3 4.28 0.82 9
## 23 Zhou et al 9.80 5.18 54 5.20 2.51 137
## 24 Zhu et al 7.80 4.13 43 6.40 2.92 71
고정효과모형 또는 랜덤효과모형으로 평균효과차이를 구하기 위해서 metacont 함수를 이용한다. metacont 함수는 두 방법의 결과를 동시에 제공 가능하기 때문에 어떤 방법을 사용할지 고민할 필요가 없다. 여기서 효과크기는 standardized mean difference (SMD)로 설정하고 교정된 평균효과크기를 위해 “Hedges” 옵션을 사용한다. 이때 사용되는 자료 값은 각 집단의 표본크기(n1, n2), 평균(m1, m2), 표준편차(s1, s2) 등 이다.
fit <- metacont(n1, m1, s1, n2, m2, s2, data=heteroc,
studlab=paste(Study),
comb.fixed = TRUE,
comb.random = TRUE,
prediction = TRUE,
sm="SMD",
method.smd="Hedges")
fit
## SMD 95%-CI %W(fixed) %W(random)
## Cao et al(1) -0.1349 [-0.6086; 0.3389] 2.6 4.4
## Cao et al(2) 1.0413 [ 0.5559; 1.5267] 2.5 4.4
## Gao et al -0.3714 [-1.0039; 0.2611] 1.5 4.0
## Guan et al -0.6818 [-0.8466; -0.5170] 21.4 5.0
## Huang et al 1.4478 [ 0.7121; 2.1836] 1.1 3.7
## Li et al 0.1168 [-0.3524; 0.5861] 2.6 4.4
## Liu et al(1) 0.1609 [-0.6373; 0.9591] 0.9 3.5
## Liu et al(2) 0.5005 [-0.1422; 1.1432] 1.4 3.9
## Lo et al 0.6239 [-0.6891; 1.9368] 0.3 2.3
## Mao et al 0.0756 [-0.1968; 0.3480] 7.8 4.9
## Qian et al 0.2092 [-0.4797; 0.8982] 1.2 3.8
## Qin et al 0.0029 [-0.1883; 0.1941] 15.9 5.0
## Ruan et al 0.9094 [ 0.5714; 1.2473] 5.1 4.7
## Song et al 0.5699 [ 0.0961; 1.0436] 2.6 4.4
## Wang et al(1) 0.0195 [-0.3306; 0.3696] 4.7 4.7
## Wang et al(2) 0.8521 [ 0.4587; 1.2455] 3.8 4.6
## Yang et al -0.3097 [-0.8718; 0.2524] 1.8 4.2
## Young et al -0.3660 [-1.3553; 0.6233] 0.6 3.0
## Yudong et al -0.0872 [-0.6166; 0.4421] 2.1 4.3
## Zhang et al(1) 0.2920 [-0.0496; 0.6336] 5.0 4.7
## Zhang et al(2) 0.8024 [ 0.4883; 1.1165] 5.9 4.8
## Zhang et al(3) 1.1024 [-0.3107; 2.5155] 0.3 2.1
## Zhou et al 1.3195 [ 0.9773; 1.6616] 5.0 4.7
## Zhu et al 0.4061 [ 0.0236; 0.7886] 4.0 4.6
##
## Number of studies combined: k = 24
##
## SMD 95%-CI z p-value
## Fixed effect model 0.1401 [ 0.0638; 0.2163] 3.60 0.0003
## Random effects model 0.3371 [ 0.0720; 0.6023] 2.49 0.0127
## Prediction interval [-0.9337; 1.6080]
##
## Quantifying heterogeneity:
## tau^2 = 0.3572 [0.1447; 0.6542]; tau = 0.5977 [0.3804; 0.8088]
## I^2 = 90.3% [86.8%; 92.8%]; H = 3.20 [2.75; 3.73]
##
## Test of heterogeneity:
## Q d.f. p-value
## 236.06 23 < 0.0001
##
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau
## - Hedges' g (bias corrected standardised mean difference)
메타분석 결과는 다음과 같은 결과를 포함하고 있다.
고정효과모형 결과만 산출하고 싶으면 comb.random = FALSE로 두고 반대로 랜덤효과모형 결과만 산출하고 싶으면 comb.fixed = FALSE로 설정한다.
효과크기 설정시 평균차는 sm=“MD”, 표준화 평균차는 sm=“SMD”, 평균비(ratio of means)는 sm=“ROM”으로 설정한다.
표준화 평균차를 보정할때는 기본적으로 method.smd=“Hedges”로 설정되어 있고 Cohen’s d는 method.smd=“Cohen”, Glass’ delta 방법은 method.smd=“Glass”로 설정한다.
메타분석 결과는 일반적으로 forest plot으로 제공하며 meta package에서는 forest 함수를 이용하여 forest plot을 쉽게 추출할 수 있다.
forest(fit)
위의 결과는 논문(Soraya and Ulhaq, 2020)에 수록된 결과와 동일함을 알 수 있다.
heterob <- read.table(text='
study e1 n1 e2 n2
Kamlesh(2001) 9 20 6 20
Chen(2004) 9 104 5 104
Cillino(2008) 7 47 1 15
Harman(2008) 18 24 7 19
Maxwell(2007) 7 153 3 160
', header=T)
heterob
## study e1 n1 e2 n2
## 1 Kamlesh(2001) 9 20 6 20
## 2 Chen(2004) 9 104 5 104
## 3 Cillino(2008) 7 47 1 15
## 4 Harman(2008) 18 24 7 19
## 5 Maxwell(2007) 7 153 3 160
이산형 자료를 이용한 고정효과모형 또는 랜덤효과모형으로 통합효과크기를 구하기 위해서 metabin 함수를 이용한다. 여기서 효과크기는 RR로 선택하고 가중값 계산 방법은 MH방법으로 둔다. 이때 필요한 자료의 형태는 각집단의 표본크기 (n1, n2) 그리고 발생한 이벤트 수(e1, e2)이다.
fit2<- metabin(e1,n1,e2,n2,
data = heterob,
studlab = paste(study),
comb.fixed = TRUE,
comb.random = TRUE,
prediction = TRUE,
sm = "RR",
method="MH")
fit2
## RR 95%-CI %W(fixed) %W(random)
## Kamlesh(2001) 1.5000 [0.6564; 3.4276] 25.8 25.8
## Chen(2004) 1.8000 [0.6243; 5.1897] 21.5 15.7
## Cillino(2008) 2.2340 [0.2984; 16.7245] 6.5 4.4
## Harman(2008) 2.0357 [1.0816; 3.8315] 33.6 44.1
## Maxwell(2007) 2.4401 [0.6426; 9.2651] 12.6 9.9
##
## Number of studies combined: k = 5
##
## RR 95%-CI z p-value
## Fixed effect model 1.9108 [1.2374; 2.9506] 2.92 0.0035
## Random effects model 1.8862 [1.2391; 2.8711] 2.96 0.0031
## Prediction interval [0.9535; 3.7313]
##
## Quantifying heterogeneity:
## tau^2 = 0; tau = 0; I^2 = 0.0% [0.0%; 79.2%]; H = 1.00 [1.00; 2.19]
##
## Test of heterogeneity:
## Q d.f. p-value
## 0.53 4 0.9703
##
## Details on meta-analytical method:
## - Mantel-Haenszel method
## - DerSimonian-Laird estimator for tau^2
## - Mantel-Haenszel estimator used in calculation of Q and tau^2 (like RevMan 5)
메타분석 결과는 다음과 같은 결과를 포함하고 있다.
고정효과모형 결과만 산출하고 싶으면 comb.random = FALSE로 두고 반대로 랜덤효과모형 결과만 산출하고 싶으면 comb.fixed = FALSE로 설정한다.
효과크기 설정시 상대위험률(RR)는 sm=“RR”, 오즈비(OR)는 sm=“OR”, 비율차(RD)는 sm=“RD”, Arcsine difference는 sm=“ASD”, Diagnostic 오즈비는 sm=“DOR”로 설정한다.
가중값 산출을 위한 방법으로 method 옵션을 적용하며, method.smd=“Inverse”는 역분산법, MH는 method.smd=“MH”, Peto 방법은 method.smd=“Peto”로 설정한다. 이외에도 method.smd=“GLMM” 과 method.smd=“SSW” 방법을 설정 가능하다.
메타분석 결과는 일반적으로 forest plot으로 제공하며 meta package에서는 forest 함수를 이용하여 forest plot을 쉽게 추출할 수 있다. 이때 layout 옵션을 통해 출력양식을 조절할 수 있다. Review Manager (RevMan) 형태로 출력을 원하면 layout=“RevMan5”로 JAMA 스타일을 원하면 layout=“JAMA” 옵션으로 조절한다.
forest(fit2)
위의 결과는 논문(Cao et al., 2019)에 수록된 Figure 12와 동일함을 알 수 있다.
효과크기의 형태를 Odds ratio로 하고 싶으면 sm=“OR”로 설정하고, MH 방법이 아닌 역분산법을 이용하고 싶으면 method=“Inverse”로 설정한다.
fitor<- metabin(e1,n1,e2,n2,
data = heterob,
studlab = paste(study),
comb.fixed = TRUE,
comb.random = TRUE,
prediction = TRUE,
sm = "OR",
method="Inverse")
fitor
## OR 95%-CI %W(fixed) %W(random)
## Kamlesh(2001) 1.9091 [0.5202; 7.0069] 21.9 21.9
## Chen(2004) 1.8758 [0.6066; 5.8003] 29.1 29.1
## Cillino(2008) 2.4500 [0.2764; 21.7146] 7.8 7.8
## Harman(2008) 5.1429 [1.3842; 19.1073] 21.5 21.5
## Maxwell(2007) 2.5091 [0.6369; 9.8857] 19.7 19.7
##
## Number of studies combined: k = 5
##
## OR 95%-CI z p-value
## Fixed effect model 2.5294 [1.3761; 4.6492] 2.99 0.0028
## Random effects model 2.5294 [1.3761; 4.6492] 2.99 0.0028
## Prediction interval [0.9414; 6.7963]
##
## Quantifying heterogeneity:
## tau^2 = 0 [0.0000; 0.9771]; tau = 0 [0.0000; 0.9885]
## I^2 = 0.0% [0.0%; 79.2%]; H = 1.00 [1.00; 2.19]
##
## Test of heterogeneity:
## Q d.f. p-value
## 1.57 4 0.8136
##
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau
Forest plot에서 layout 옵션을 통해 출력양식을 조절할 수 있다. Review Manager (RevMan) 형태로 출력을 원하면 layout=“RevMan5” 옵션으로 조절한다.
forest(fitor, layout="RevMan5")
heteroh <- read.table(text='
study loghr se_loghr
APPROACH(2011) -0.1424 0.1166
Bonacchi(2006) -0.4055 0.6551
Buxton(1998) -0.3415 0.1256
Carrier_p(2009) -0.0781 0.162
Carrier_n(2009) -0.4368 0.1197
DiMauro(2005) -0.5306 0.2349
Endo(2001) -0.0502 0.1787
Glineur(2012) -0.298 0.1259
Grau(2012) -0.3955 0.1126
Joo(2012) -0.0125 0.2648
Kelly(2012) -0.2008 0.1004
Kinoshita(2012) -0.5906 0.2962
Kurlansky(2010) -0.1778 0.0426
Locker_only(2012) -0.2247 0.1904
Locker_RA(2012) -0.1434 0.2412
Locker_SV(2012) -0.312 0.1276
Lytle(2004) -0.2739 0.0704
Navia(2013) -0.0194 0.343
Parsa(2013) -0.0547 0.067
Pick(1997) -0.2002 0.2489
Puskas(2012) -0.4309 0.1546
Stevens(2004) -0.3081 0.1034
Toumpoulis(2006) -0.12 0.1281
', header=T)
heteroh
## study loghr se_loghr
## 1 APPROACH(2011) -0.1424 0.1166
## 2 Bonacchi(2006) -0.4055 0.6551
## 3 Buxton(1998) -0.3415 0.1256
## 4 Carrier_p(2009) -0.0781 0.1620
## 5 Carrier_n(2009) -0.4368 0.1197
## 6 DiMauro(2005) -0.5306 0.2349
## 7 Endo(2001) -0.0502 0.1787
## 8 Glineur(2012) -0.2980 0.1259
## 9 Grau(2012) -0.3955 0.1126
## 10 Joo(2012) -0.0125 0.2648
## 11 Kelly(2012) -0.2008 0.1004
## 12 Kinoshita(2012) -0.5906 0.2962
## 13 Kurlansky(2010) -0.1778 0.0426
## 14 Locker_only(2012) -0.2247 0.1904
## 15 Locker_RA(2012) -0.1434 0.2412
## 16 Locker_SV(2012) -0.3120 0.1276
## 17 Lytle(2004) -0.2739 0.0704
## 18 Navia(2013) -0.0194 0.3430
## 19 Parsa(2013) -0.0547 0.0670
## 20 Pick(1997) -0.2002 0.2489
## 21 Puskas(2012) -0.4309 0.1546
## 22 Stevens(2004) -0.3081 0.1034
## 23 Toumpoulis(2006) -0.1200 0.1281
본 연구에서는 Log(HR)과 SE(log(HR)) 값이 주어 졌을때, 메타분석을 위해 metagen 함수를 이용한다. metagen 함수는 effect size와 SE 값이 주어진 경우 메타분석을 시행하게 해준다. 따라서 Hazard ratio 뿐만 아니라 연속형자료와 비율형 자료 모두 사용 가능하다. 이때 효과크기 유형은 sm 옵션에서 조절하며, “RD”, “RR”, “OR”, “ASD”, “HR”, “MD”, “SMD”, “ROM” 등이 가능하다.
fit3<- metagen(loghr,se_loghr,
data = heteroh,
studlab = paste(study),
comb.fixed = TRUE,
comb.random = FALSE,
prediction = TRUE,
sm = "HR")
fit3
## HR 95%-CI %W(fixed)
## APPROACH(2011) 0.8673 [0.6901; 1.0899] 3.9
## Bonacchi(2006) 0.6666 [0.1846; 2.4072] 0.1
## Buxton(1998) 0.7107 [0.5556; 0.9091] 3.4
## Carrier_p(2009) 0.9249 [0.6733; 1.2705] 2.0
## Carrier_n(2009) 0.6461 [0.5110; 0.8169] 3.7
## DiMauro(2005) 0.5883 [0.3712; 0.9322] 1.0
## Endo(2001) 0.9510 [0.6700; 1.3499] 1.7
## Glineur(2012) 0.7423 [0.5800; 0.9501] 3.4
## Grau(2012) 0.6733 [0.5400; 0.8396] 4.2
## Joo(2012) 0.9876 [0.5877; 1.6595] 0.8
## Kelly(2012) 0.8181 [0.6719; 0.9960] 5.3
## Kinoshita(2012) 0.5540 [0.3100; 0.9900] 0.6
## Kurlansky(2010) 0.8371 [0.7701; 0.9100] 29.5
## Locker_only(2012) 0.7988 [0.5500; 1.1601] 1.5
## Locker_RA(2012) 0.8664 [0.5400; 1.3901] 0.9
## Locker_SV(2012) 0.7320 [0.5700; 0.9400] 3.3
## Lytle(2004) 0.7604 [0.6624; 0.8729] 10.8
## Navia(2013) 0.9808 [0.5007; 1.9210] 0.5
## Parsa(2013) 0.9468 [0.8303; 1.0796] 11.9
## Pick(1997) 0.8186 [0.5026; 1.3333] 0.9
## Puskas(2012) 0.6499 [0.4800; 0.8800] 2.2
## Stevens(2004) 0.7348 [0.6000; 0.8999] 5.0
## Toumpoulis(2006) 0.8869 [0.6900; 1.1400] 3.3
##
## Number of studies combined: k = 23
##
## HR 95%-CI z p-value
## Fixed effect model 0.8048 [0.7691; 0.8421] -9.38 < 0.0001
## Prediction interval [0.7174; 0.8858]
##
## Quantifying heterogeneity:
## tau^2 = 0.0018 [0.0000; 0.0166]; tau = 0.0429 [0.0000; 0.1289]
## I^2 = 12.0% [0.0%; 45.9%]; H = 1.07 [1.00; 1.36]
##
## Test of heterogeneity:
## Q d.f. p-value
## 24.99 22 0.2974
##
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau
메타분석 결과는 다음과 같은 결과를 포함하고 있다.
메타분석 결과는 일반적으로 forest plot으로 제공하며 meta package에서는 forest 함수를 이용하여 forest plot을 쉽게 추출할 수 있다.
forest(fit3,layout = "RevMan5")
위의 결과는 논문(Takagi et al., 2014)에 수록된 Figure 1과 동일함을 알 수 있다.
Forest plot에서 layout 옵션을 “JAMA”로 두면 “Journal of the American Medical Association (JAMA)” 에서 추천하는 형태로 출력이 된다.
forest(fit3,layout = "JAMA")
<! —— Chapter 4. 조절효과분석 ————————->
효과크기분석 결과 각 연구 간 효과크기의 이질성(heterogeneity)이 상당한 수준으로 나타난 경우에는 그 이질성의 배경이나 원인에 대한 추가적인 설명이 필요하며, 이를 위해 조절효과분석이 필요하다. 즉, 조절효과분석은 효과크기의 차이를 설명해줄 수 있는 연구수준의 변수, 즉 조절변수를 고려하여 효과크기의 이질성을 설명한다.
메타분석에서 조절효과분석은 하위집단(subgroup) 간의 효과크기 차이를 보다 직접적으로 검증할 수 있게 하며, 평균효과크기에 영향을 주는 변수, 즉 조절변수의 영향력을 검증할 수 있게 한다. 또한 평균효과크기에 영향을 주는 변수, 즉 조절변수의 영향력을 검증할 수 있도록 한다. 조절변수(covariate or moderators)는 일반적으로 독립변수와 종속변수의 관계에 영향을 주는 변수로서, 메타분석에서는 연구 수준(study-level)의 변수를 말한다. 예를 들어, 연구대상자들에 대한 그룹화 방식(무작위배정 또는 비무작위배정), 프로그램의 기간, 출간 형태(학술지 논문 여부) 등이 조절변수가 된다.
조절효과분석은 효과크기의 이질성을 설명하는 연구 차원(study-level)의 변수, 즉 조절변수를 통해 수행된다. 분석 방법으로는 일반적으로 1) 조절변수가 범주형 변수일 경우 메타 ANOVA; 2) 조절변수가 연속형 변수일 경우 메타회귀분석(meta-regression)이 있다. 이 두가지 방법은 메타분석이 아닌 일차적인 연구에서 활용되는 분산분석(ANOVA)이나 OLS(ordinary least square) 회귀분석과는 다르다. 즉 데이터의 모든 분산을 설명하는 것이 아니라 실제분산(연구 간 분산)을 설명하고자 하는 것이다. 그리고 메타회귀분석의 경우 조절변수당 최소 10개의 연구가 필요하다(Higgins & Green, 2011).
조절효과분석은 비실험적(nonexperimental 또는 observational) 분석으로써 인과관계(causal relationship)를 유추할 수 있는 것은 아니며, 일반적으로 효과크기의 차이 및 그 이질성에 대한 원인, 배경 등에 대한 가설을 만들어내는(generating hypothesis) 역할을 한다. 즉 조절효과분석의 목적은 효과크기의 이질성에 관하여 있을 법한 원인(possible causes for heterogeneity)에 대한 탐색적 설명을 하는 데 있다.
효과 크기 추정을 덜 정확하게 만드는 연구 간 이질성의 또 다른 원인은 연구 간 연구 설계 차이 또는 중재 요소의 차이 등이 있다. 예를 들어, 대학생의 우울증에 대한 인지 행동 치료(CBT)의 효과에 대한 메타 분석에서 일부 연구는 그룹 환경에서 중재를 제공하고 다른 연구는 각 학생에게 개별적으로 치료를 제공 한 경우를 들 수 있다. 같은 예에서, 각 연구 내에서 학생이 우울증을 앓고 있는지 확인하기 위해 다른 기준을 사용한 경우를 들 수 있다 (예 : 진단 인터뷰 또는 자가보고 설문지 사용).
이러한 종류의 연구 간 차이점이 존재할 수 있으며, 연구 간 차이점이 전체 효과크기를 결정하는데 영향을 줄 수도 있기 때문에 하위 그룹 분석을 통해 메타분석 연구 내에서 하위그룹간 차이를 살펴보고 그 효과가 다르게 나타나는지 확인해야 한다.`
하위그룹 분석의 개념을 좀 더 살펴보면, 모든 하위그룹 분석은 (1) 각 하위그룹의 효과를 통합하고 (2) 하위그룹의 효과를 비교하는 두 부분으로 구성된다(Borenstein and Higgins 2013).
각 하위그룹의 효과 통합은 하위 그룹 내에서 단순 메타분석과 동일한 기준이 적용되기 때문에 간단히 확인 가능하다.
각 하위그룹에 대한 합동 효과를 계산한 후 하위그룹간 효과 크기를 비교할 수 있다. 그러나 이 차이가 실제로 중요하거나 의미가 있는지 확인하려면 하위그룹간 효과 크기 차이에 대한 \(SE_{diff}\), 즉 차이에 대한 표준오차를 계산하고 이를 통해 신뢰 구간 산출 및 유의성 검정을 수행해야 한다. 표준오차를 계산하는 방법에는 크게 두 가지가 있으며 서로 다른 가정을 기반으로 한다.
\[ V_{diff}=V_a +V_B \]
하위그룹간 차이 검정을 위한 고정효과 모형은 하위그룹 내에서 랜덤효과 모형을 통합효과크기를 추정한 경우에도 사용가능하다. 이러한 모형을 혼합효과(mixed-effects) 모형이라 한다.
\[ V_{diff}=V_A + V_B +\frac{T^2}{m} \] 여기서 \(T^2\)은 하위그룹간 분산이고 \(m\)은 하위그룹의 수이다.
하위그룹 분석은 항상 정보에 입각하여 사전에 결정되어야 한다. 실질적으로 연구 내에서 하위그룹간 차이가 있을 수 있어야 하며, 관련 연구 질문에 대한 정보 획득으로 이어져야한다. 따라서 분석을 수행하기 전에 하위그룹간 분석을 위한 변수를 지정하고 분석 계획에 기재하는 것도 좋은 방법이다.
하위그룹간 분석은 종종 연구자체에 제한을 받을 수 있다. 하위그룹 분석에도 충분한 검정력이 확보되어야 하기 때문에 메타분석의 전체 연구 수가 \(k<10\)인 경우에는 두 그룹 이상의 하위그룹을 비교하는 것은 의미가 없다(Higgins and Thompson, 2004).
multi <- read.table(text='
study n1 m1 s1 n2 m2 s2 distance
"Leyand MD 2002" 29 0.01 0.08 16 -0.01 0.11 4m
"NijKamp MD 2004" 68 0.02 0.1 69 0.03 0.1 4m
"Peng C 2012" 50 -0.02 0.06 51 -0.04 0.08 4m
"Ye PP 2010" 50 0.02 0.06 50 0.01 0.04 5m
"Harman FE 2008" 19 0 0.09 24 -0.1 0.09 unclear
"Rasp M 2012" 113 0.27 0.2 28 0.28 0.19 unclear
"Puell MC 2015" 21 0.12 0.09 18 0 0.06 unclear
', header=T)
multi
## study n1 m1 s1 n2 m2 s2 distance
## 1 Leyand MD 2002 29 0.01 0.08 16 -0.01 0.11 4m
## 2 NijKamp MD 2004 68 0.02 0.10 69 0.03 0.10 4m
## 3 Peng C 2012 50 -0.02 0.06 51 -0.04 0.08 4m
## 4 Ye PP 2010 50 0.02 0.06 50 0.01 0.04 5m
## 5 Harman FE 2008 19 0.00 0.09 24 -0.10 0.09 unclear
## 6 Rasp M 2012 113 0.27 0.20 28 0.28 0.19 unclear
## 7 Puell MC 2015 21 0.12 0.09 18 0.00 0.06 unclear
하위그룹 분석은 metacont 함수에서 “byvar” 옵션으로 설정한다. 여기서 효과크기는 mean difference (MD)로 설정하고 교정된 평균효과크기를 위해 “Hedges” 옵션을 사용한다.
fit <- metacont(n1, m1, s1, n2, m2, s2, data=multi,
studlab=paste(study),
comb.fixed = TRUE,
comb.random = TRUE,
prediction = TRUE,
sm="MD")
fit
## MD 95%-CI %W(fixed) %W(random)
## Leyand MD 2002 0.0200 [-0.0413; 0.0813] 4.5 11.7
## NijKamp MD 2004 -0.0100 [-0.0435; 0.0235] 15.1 16.4
## Peng C 2012 0.0200 [-0.0075; 0.0475] 22.3 17.4
## Ye PP 2010 0.0100 [-0.0100; 0.0300] 42.3 18.4
## Harman FE 2008 0.1000 [ 0.0458; 0.1542] 5.8 12.9
## Rasp M 2012 -0.0100 [-0.0895; 0.0695] 2.7 9.2
## Puell MC 2015 0.1200 [ 0.0726; 0.1674] 7.5 14.0
##
## Number of studies combined: k = 7
##
## MD 95%-CI z p-value
## Fixed effect model 0.0226 [ 0.0096; 0.0356] 3.40 0.0007
## Random effects model 0.0348 [ 0.0019; 0.0677] 2.07 0.0382
## Prediction interval [-0.0714; 0.1409]
##
## Quantifying heterogeneity:
## tau^2 = 0.0014 [0.0004; 0.0115]; tau = 0.0377 [0.0211; 0.1070]
## I^2 = 79.9% [59.1%; 90.2%]; H = 2.23 [1.56; 3.19]
##
## Test of heterogeneity:
## Q d.f. p-value
## 29.89 6 < 0.0001
##
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau
forest(fit)
fit_sub <- metacont(n1, m1, s1, n2, m2, s2, data=multi,
studlab=paste(study),
comb.fixed = TRUE,
comb.random = TRUE,
prediction = TRUE,
sm="MD",
byvar=distance)
fit_sub
## MD 95%-CI %W(fixed) %W(random) distance
## Leyand MD 2002 0.0200 [-0.0413; 0.0813] 4.5 11.7 4m
## NijKamp MD 2004 -0.0100 [-0.0435; 0.0235] 15.1 16.4 4m
## Peng C 2012 0.0200 [-0.0075; 0.0475] 22.3 17.4 4m
## Ye PP 2010 0.0100 [-0.0100; 0.0300] 42.3 18.4 5m
## Harman FE 2008 0.1000 [ 0.0458; 0.1542] 5.8 12.9 unclear
## Rasp M 2012 -0.0100 [-0.0895; 0.0695] 2.7 9.2 unclear
## Puell MC 2015 0.1200 [ 0.0726; 0.1674] 7.5 14.0 unclear
##
## Number of studies combined: k = 7
##
## MD 95%-CI z p-value
## Fixed effect model 0.0226 [ 0.0096; 0.0356] 3.40 0.0007
## Random effects model 0.0348 [ 0.0019; 0.0677] 2.07 0.0382
## Prediction interval [-0.0714; 0.1409]
##
## Quantifying heterogeneity:
## tau^2 = 0.0014 [0.0004; 0.0115]; tau = 0.0377 [0.0211; 0.1070]
## I^2 = 79.9% [59.1%; 90.2%]; H = 2.23 [1.56; 3.19]
##
## Test of heterogeneity:
## Q d.f. p-value
## 29.89 6 < 0.0001
##
## Results for subgroups (fixed effect model):
## k MD 95%-CI Q I^2
## distance = 4m 3 0.0092 [-0.0109; 0.0293] 1.97 0.0%
## distance = 5m 1 0.0100 [-0.0100; 0.0300] 0.00 --
## distance = unclear 3 0.0910 [ 0.0584; 0.1235] 7.75 74.2%
##
## Test for subgroup differences (fixed effect model):
## Q d.f. p-value
## Between groups 20.17 2 < 0.0001
## Within groups 9.72 4 0.0454
##
## Results for subgroups (random effects model):
## k MD 95%-CI tau^2 tau
## distance = 4m 3 0.0092 [-0.0109; 0.0293] 0 0
## distance = 5m 1 0.0100 [-0.0100; 0.0300] -- --
## distance = unclear 3 0.0769 [ 0.0099; 0.1438] 0.0026 0.0506
##
## Test for subgroup differences (random effects model):
## Q d.f. p-value
## Between groups 3.71 2 0.1562
##
## Prediction intervals for subgroups:
## 95%-PI
## distance = 4m [-0.1211; 0.1395]
## distance = 5m
## distance = unclear [-0.6989; 0.8526]
##
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau
메타분석 결과는 다음과 같은 결과를 포함하고 있다.
하위그룹 분석결과를 살펴보면 랜덤효과모형에서 between group의 \(Q\) 값이 \(3.71\), \(p-value\)가 \(0.1562\)로 거리로 인한 차이는 없는것으로 나타난다.
메타분석 결과는 일반적으로 forest plot으로 제공하며 meta package에서는 forest 함수를 이용하여 forest plot을 쉽게 추출할 수 있다.
forest(fit_sub)
위의 결과는 논문(Cao et al., 2019)에 수록된 Figure 7와 동일함을 알 수 있다.
메타회귀(Meta-regression)분석은 개념적으로 하위그룹분석과 크게 다르지 않다. 하위그룹 분석에서 두 그룹 이상 비교하는 것은 메타회귀에서 범주형 변수를 예후인자(predictor)로 사용하는것과 같다. 하지만 메타회귀는 예후인자로 범주형 변수 뿐만 아니라 연속형 변수도 사용가능하며 이러한 변수가 효과크기 차이에 영향을 주는지도 살펴 볼 수 있다.
일반적으로 회귀분석은 환자 단위 수준에서 수행되지만 메타분석에서는 환자 단위의 분석이 불가능하며, 통합된 효과에 대해서 수행하기 때문에 연구 수준의 예후인자가 필요하다. 이는 회귀분석을 수행할 만큼 충분한 표본을 확보하지 못할 가능성이 있음을 시사한다. 하위그룹분석에서는 최소 10개의 개별연구가 필요하며, 메타회귀 분석에서는 공변량(covariate)당 최소 10개의 연구가 필요하지만 이것이 절대적인 규칙이 될수는 없다.
일반적인 회귀분석은 공변량 \(x_j\)를 통해 반응변수 \(y_i\)에 영향을 주는 회귀계수 \(\beta_j\)의 크기를 추정하는데 관심이 있고, 이를 통한 회귀 모형은 다음과 같다.
\[ y_i=\beta_0 + \beta_1x_{1i} +\cdots + \beta_nx_{pi}+\epsilon_i \]
메타회귀에서는 예후인자에 따른 효과와 효과크기 \(\theta_k\)를 추정하는데 관심이 있고, 따라서 회귀모형은 다음과 같다.
\[ \theta_k=\theta+\beta_1x_{1k}+\cdots+\beta_nx_{nk}+\epsilon_k+\zeta_k \]
여기서 \(\epsilon_k\)는 실제(true) 효과로부터 벗어난 표본오차를 의미하며 \(\zeta_k\)는 효과크기 분포로부터 나타난 연구간 실제 효과크기를 의미한다. 두 항(term)은 독립을 가정하며, 랜덤효과모형에서 나타나는 에러항과 같은 역할을 한다. 고정효과 모형에서는 같은 효과크기를 공유하기 때문에 연구간 이질성 \(\tau^2=0\)로 나타난다. 따라서 이때는 \(\zeta_k\)를 고려하지 않는다.
위의 회귀모형은 고정효과(\(\beta\) coefficients)와 랜덤효과(\(\zeta_k\))를 모두 포함하기 때문에 메타회귀에서 사용하는 모형을 혼합효과 모형(mixed-effects model)이라고 한다. 수리적으로 이 모형은 하위그룹 분석에서 언급한 혼합효과 모형과 같다. 하위그룹 분석의 형태를 메타회귀 형태로 표현할때는 범주형 자료를 더미(dummy) 변수화해서 공변량으로 사용하면 된다. 예를 들어, \(D_k=(0, 1)\)인 경우 메타회귀 모형은 다음과 같다.
\[ \theta_k=\theta + \beta x_k + D_k \gamma +\epsilon_k +\zeta_k \]
tb <- read.table(text='
study e1 n1 e2 n2 start latitude country allocation allo2
"Ferguson & Simes" 6 306 29 303 1933 55 "Canada" "Random allocation" 1
"Aronson" 4 123 11 139 1935 52 "Northern USA" "Random allocation" 1
"Rosenthal et al" 17 1716 65 1665 1941 42 "Chicago" "alternation/systematic allocation" 0
"Comstrock & Webster" 5 2498 3 2341 1947 33 "Georgia(Sch)" "alternation/systematic allocation" 0
"Comstock et al (a)" 186 50634 141 27338 1949 18 "Puerto Rico" "alternation/systematic allocation" 0
"Frimont-Moller et al" 33 5069 47 5808 1950 13 "Madanapalle" "alternation/systematic allocation" 0
"Comstock et al (b)" 27 16913 29 17854 1950 33 "Georgia (Comm)" "alternation/systematic allocation" 0
"Hart & Sutherland" 62 13598 248 12867 1950 53 "Uk" "Random allocation" 1
"Vandeviere et al" 8 2545 10 629 1965 18 "Haiti" "Random allocation" 1
"Coetzee & Berjak" 29 7499 45 7277 1965 27 "South Africa" "Random allocation" 1
"TB Prevention Trial" 505 88391 499 88391 1968 13 "Madras" "Random allocation" 1
', header=T)
tb
## study e1 n1 e2 n2 start latitude country
## 1 Ferguson & Simes 6 306 29 303 1933 55 Canada
## 2 Aronson 4 123 11 139 1935 52 Northern USA
## 3 Rosenthal et al 17 1716 65 1665 1941 42 Chicago
## 4 Comstrock & Webster 5 2498 3 2341 1947 33 Georgia(Sch)
## 5 Comstock et al (a) 186 50634 141 27338 1949 18 Puerto Rico
## 6 Frimont-Moller et al 33 5069 47 5808 1950 13 Madanapalle
## 7 Comstock et al (b) 27 16913 29 17854 1950 33 Georgia (Comm)
## 8 Hart & Sutherland 62 13598 248 12867 1950 53 Uk
## 9 Vandeviere et al 8 2545 10 629 1965 18 Haiti
## 10 Coetzee & Berjak 29 7499 45 7277 1965 27 South Africa
## 11 TB Prevention Trial 505 88391 499 88391 1968 13 Madras
## allocation allo2
## 1 Random allocation 1
## 2 Random allocation 1
## 3 alternation/systematic allocation 0
## 4 alternation/systematic allocation 0
## 5 alternation/systematic allocation 0
## 6 alternation/systematic allocation 0
## 7 alternation/systematic allocation 0
## 8 Random allocation 1
## 9 Random allocation 1
## 10 Random allocation 1
## 11 Random allocation 1
기본적인 효과크기분석 결과는 다음과 같다.
reg<- metabin(e1,n1,e2,n2,
data = tb,
studlab = paste(study),
comb.fixed = TRUE,
comb.random = FALSE,
prediction = TRUE,
sm = "RR",
method="Inverse")
reg
## RR 95%-CI %W(fixed)
## Ferguson & Simes 0.2049 [0.0863; 0.4864] 1.1
## Aronson 0.4109 [0.1343; 1.2574] 0.7
## Rosenthal et al 0.2538 [0.1494; 0.4310] 3.0
## Comstrock & Webster 1.5619 [0.3737; 6.5284] 0.4
## Comstock et al (a) 0.7122 [0.5725; 0.8860] 17.4
## Frimont-Moller et al 0.8045 [0.5163; 1.2536] 4.2
## Comstock et al (b) 0.9828 [0.5821; 1.6593] 3.0
## Hart & Sutherland 0.2366 [0.1793; 0.3121] 10.8
## Vandeviere et al 0.1977 [0.0784; 0.4989] 1.0
## Coetzee & Berjak 0.6254 [0.3926; 0.9962] 3.8
## TB Prevention Trial 1.0120 [0.8946; 1.1449] 54.6
##
## Number of studies combined: k = 11
##
## RR 95%-CI z p-value
## Fixed effect model 0.7305 [0.6668; 0.8002] -6.75 < 0.0001
## Prediction interval [0.1160; 2.2249]
##
## Quantifying heterogeneity:
## tau^2 = 0.3818 [0.1425; 1.5389]; tau = 0.6179 [0.3774; 1.2405]
## I^2 = 92.0% [87.7%; 94.8%]; H = 3.54 [2.86; 4.40]
##
## Test of heterogeneity:
## Q d.f. p-value
## 125.63 10 < 0.0001
##
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau
위의 분석 결과를 forest plot으로 제시하면 다음과 같다.
forest(reg)
결과를 살펴보면 전체 분산 중 연구 간 분산이 차지하는 비율이 \(92\%\)로 나타나 연구 간 효과크기의 이질성이 매우 크다는 것을 알 수 있다. 따라서 이러한 효과크기의 이질성을 설명하기 위한 추가적인 분석이 필요하다. 먼저 연구대상자 배정에 대한 범주형 변수인 allo2를 조절변수로 하여 메타회귀 분석을 시행하면 다음과 같다.
메타회귀 분석은 meta 패키지에서 metareg 함수로 시행한다.
metareg(reg, allo2)
##
## Mixed-Effects Model (k = 11; tau^2 estimator: DL)
##
## tau^2 (estimated amount of residual heterogeneity): 0.5607 (SE = 0.4220)
## tau (square root of estimated tau^2 value): 0.7488
## I^2 (residual heterogeneity / unaccounted variability): 92.79%
## H^2 (unaccounted variability / sampling variability): 13.86
## R^2 (amount of heterogeneity accounted for): 0.00%
##
## Test for Residual Heterogeneity:
## QE(df = 9) = 124.7494, p-val < .0001
##
## Test of Moderators (coefficient 2):
## QM(df = 1) = 1.3737, p-val = 0.2412
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## intrcpt -0.3664 0.3663 -1.0003 0.3172 -1.0843 0.3515
## allo2 -0.5828 0.4973 -1.1720 0.2412 -1.5574 0.3918
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
bubble(metareg(reg, allo2))
메타회귀 분석 결과를 보면, allo2는 랜덤배정(allo2=1)의 경우 비랜덤배정(allo2=0)에 비해 효과크기가 0.58만큼 감소하지만 통계적으로 유의하지 않은 것으로 나타난다.(\(p-value=0.241\))
여기서 각 연구가 수행된 위도, 즉 latitude를 연속형 조절변수로 하여 메타회귀분석을 실시하면 다음과 같은 결과를 얻는다.
metareg(reg, latitude)
##
## Mixed-Effects Model (k = 11; tau^2 estimator: DL)
##
## tau^2 (estimated amount of residual heterogeneity): 0.0652 (SE = 0.0654)
## tau (square root of estimated tau^2 value): 0.2553
## I^2 (residual heterogeneity / unaccounted variability): 61.80%
## H^2 (unaccounted variability / sampling variability): 2.62
## R^2 (amount of heterogeneity accounted for): 82.93%
##
## Test for Residual Heterogeneity:
## QE(df = 9) = 23.5614, p-val = 0.0051
##
## Test of Moderators (coefficient 2):
## QM(df = 1) = 17.7319, p-val < .0001
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## intrcpt 0.2539 0.2333 1.0883 0.2765 -0.2034 0.7112
## latitude -0.0298 0.0071 -4.2109 <.0001 -0.0436 -0.0159 ***
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
조절변수인 latitude의 회귀계수는 \(\beta=-0.0298 (p-value<.0001)\)로 유의하게 나타났으며, 조절변수에 의해 설명되는 연구 간 분산의 비율 \(R^2=82.93\%\)로 나타나 그 설명력이 매우 높다는 것을 알 수 있다. 회귀분석의 결과를 회귀선으로 나타내면 다음과 같다.
bubble(metareg(reg,latitude))
이러한 그림을 bubble plot이라 하며 meta 패키지의 bubble 함수를 이용하여 표현한다.
다른 연구와 마찬가지로 메타분석에서도 여러가지 비뚤림(bias)이 존재하며, 그 유형으로는 언어적 비뚤림(language bias), 접근성 비뚤림(availability bias), 친숙도 비뚤림(familiarity bias), 결과보고 비뚤림(outcome-reporting bias), 비용 비뚤림(cost bais) 등이 있다.
| 비뚤림 유형 | 내용 |
|---|---|
| 언어적 비뚤림 | 영어로 출간된 연구 결과를 선별적으로 포함시켜서 발생하는 비뚤림 |
| 접근성 비뚤림 | 연구자가 접근하기 쉬운 연구 결과를 선별적으로 포함시키는 비뚤림 |
| 친숙도 비뚤림 | 자신의 학문 분야의 연구 결과만을 선별적으로 포함시키는 비뚤림 |
| 결과보고 비뚤림 | 연구자가 연구 결과를 선별적으로 보고하는 경우, 즉 일반적으로 통계적으로 유의한 연구 결과는 그렇지 않은 연구 결과보다 더 잘 보고되는 경향이 있으므로 발생하는 비뚤림 |
| 비용 비뚤림 | 무료 또는 저비용으로 이용 가능한 연구를 선별적으로 포함하는 경우에 생기는 비뚤림 |
출판 비뚤림은 일반적으로 연구 결과의 속성이나 방향에 따라 연구 결과가 출판되거나 출판 되지 못하는 비뚤림을 의미한다. 하지만 메타분석에서 출판 비뚤림을 논할 때는 Copas & Shi(2000)가 언급한 출판(publication)의 의미 즉, 메타분석에 포함될 연구를 선정하는 전체 과정(the whole process of selecting a study)을 의미한다.
메타분석에 포함된 연구로부터 나타난 분석 결과가 분석에 포함되어야 할 연구들이 모두 포함되었을 때 나타나는 분석 결과와 체계적으로 다르다면 출판 비뚤림이 존재한다고 할 수 있다. 즉, 출판된 연구의 결과가 모든(수행된) 연구의 결과를 대표하지 못할 때 출판 비뚤림이 발생하는 것이다. 따라서 메타분석에 포함된 연구가 관련된 모든 연구들의 왜곡된 표본(biased sample)이라면, 그 결과(즉 메타분석의 결과로) 나타난 전체효과크기는 왜곡된 – 일반적으로 과대추정(overestimated)된 – 결과라고 할 수 있다.
문헌에는 출판된 문헌뿐만 아니라 출판되지 않은 회색문헌(grey literature)도 존재하는데 이는 기술 보고서(technical reports), 정부 보고서(governmental reports), 학위논문(thesis/dissertation), 회의자료(conference papers) 등과 같은 것이다. 만약 이러한 회색문헌이 메타분석에 포함되지 않았다면 메타분석은 표본추출 비뚤림(sampling bias)으로부터 자유로울 수 없다. 또한 긍정적인 결과를 보여주는, 그리고 통계적으로 유의미한 결과를 보여주는 연구는 그렇지 않은 연구보다 출판될 가능성이 높으므로 출판된 연구는 메타분석에 포함될 가능성이 높다. 따라서 통계적으로 유의하지 않거나 긍정적인 결과를 도출하지 못한 연구는 출판되지 않아서 메타분석에 포함되지 않을 가능성이 높으므로 이는 누락된 연구(missing studies)로 나타난다.
메타분석에 있어서 표본크기(sample size)가 작은 연구들이 상대적으로 큰 효과크기를 보이는 경향을 small-study effects라고 한다. 통계적 유의성에 상관없이 표본이 큰 연구들은 출판될 가능성이 높고, 표본이 중간 크기인 경우 출판되지 않을 가능성이 있다. 또한 표본이 작은 연구들은 출판되지 않을 가능성(missing)이 가장 높지만 효과크기가 크다면 출판될 가능성이 있다. 즉, 메타분석에 포함된 연구 중 표본크기가 작은 연구는 효과크기가 상대적으로 큰 연구일 가능성이 높다고 할 수 있다. 따라서 ‘small-study effects’에 대한 이러한 가설을 검정하기 위해 표본크기와 효과크기의 관계를 고찰할 필요가 있다. 만약 이 양자 간에 어떤 의미 있는 관계가 존재한다면 표본크기가 작은 연구로 인한 영향에 대한 가설은 사실(true)이라고 볼 수 있다. 즉, 메타분석에 포함된 연구들 중에서 표본크기가 작은 연구들의 효과크기가 상대적으로 크다면, 이것은 samll-study effects, 출판 비뚤림이 존재한다는 근거로 볼 수 있다.
출판 비뚤림에 대한 분석 과정은 다음과 같다.
일반적으로 출판 비뚤림에 대한 분석 목표는 다음 중 한가지로 볼 수 있다.
1. 비뚤림의 영향력(the impact of bias)이 미미하다.
2 비뚤림의 영향력이 미미하지는 않지만 결과에 영향을 줄 정도는 아니다.
3. 비뚤림이 심각해서 연구 결과가 의심스럽다.
출판 비뚤림이 존재하는지 살펴보는 가장 좋은 출발점은 메타분석의 결과를 검토해보는 것으로, forest plot을 살펴보는 것이 좋다. Forest plot은 개별 연구 결과와 전체 결과를 동시에 보여준다. 즉 각 개별연구들의 결과(효과크기 및 통계적 유의성)와 패턴, 그리고 전체 연구 결과의 양상(평균효과크기 및 통계적 유의성)을 보여준다. 아래 Forest plot을 살펴보면 가중값이 작은 연구들 즉 표본의 크기가 작은 연구들이 대체로 효과크기가 큰 것으로 나타남을 알 수 있다. 즉 ‘small-study effects’ 가능성이 있는 것으로 볼 수 있다.
메타분석에서 표본의 크기와 효과크기의 관계를 보여주기 위해 funnel plot을 이용한다. 깔대기 모양을 하고 있다고 해서 funnel plot이라 부르며, 수평축에는 효과크기, 수직축에는 표준오차(standard error)로 구성된다. 일반적으로 표본이 큰 연구들은 그래프의 상단에 위치하며, 가운데 직선 즉 평균효과크기 주변에 몰려있다. 하지만 표본크기가 작은 연구들은 표과크기와 표준오차가 더 크기 때문에 그래프의 하단에 위치하며 상대적으로 폭넓게 분포되어 있다. Funnel plot의 대각선은 각 효과크기의 95% 신뢰구간을 나타낸다. 만약, 출판 비뚤림이 없다면 즉, small-study effects가 존재하지 않는다면 funnel plot은 평균을 중심으로 좌우대칭(symmetry)의 모습을 보이게 되며, 반면에 비대칭(asymmetry)의 모습을 보인다면 출판 비뚤림이 있음(biased)을 보여주는 것이다. 비대칭을 파악하는 데는 시각적으로 확인하는 방법과 통계적으로 검증하는 방법 두 가지가 있다.
Funnel plot은 효과크기의 분포가 비대칭임을 쉽게 보여주지만, 시각적 분석은 주관적 판단에 의존하기 때문에 엄격한 방법이 될 수 없으므로 비대칭에 대한 통계적 분석으로 Egger’s regression test를 이용한다. Egger 방법은 각 연구의 효과크기와 표준오차와의 관계를 회귀식으로 설명하며, 효과크기와 표준오차는 관계가 없다는 귀무가설(bias=0 즉, no small-study effects)을 통해 통계적 유의성을 살펴본다. Funnel plot의 비대칭을 검증하기 위한 또 다른 방법으로 Begg & Mazumdar (1994)의 rank correlation test를 이용하기도 한다. 하지만 이 방법은 효과크기와 분산과의 서열상관관계를 검증하기 때문에 Egger의 regression test보다 검증력이 약한 것으로 알려져 있다.
만약 비뚤림(bias)이 있는 것으로 밝혀졌다면 그 비뚤림은 전체 연구 결과에 어느 정도 영향을 주는가를 밝혀야 한다. 이를 위해 일반적으로 trim-and-fill 방법을 사용하며 과정은 다음과 같다.
1. Trim: funnel plot에서 먼저 좌유대칭이 되도록 대칭이 되지 않는 연구들을 제외한다.
2. 대칭이 되지 않은 연구들을 제외시킨 후 평균을 다시 구한다.
3. Fill: 새로운 평균을 중심으로 하여 제외된 연구들을 복원시킨 후, 이 복원된 연구들과 대칭이 되도록 누락되었다고 생각하는 연구들을 새롭게 채운다.
메타분석에서는 항상 출판 비뚤림에 대한 분석을 하는 것이 중요하다. 이는 메타분석의 결과가 신빙성이 있는 것인지 아니면 의심스러운지 독자들이 판단할 수 있는 중요한 근거를 제공한다. 따라서 출판 비뚤림 분석은 개별 메타분석 연구뿐만 아니라 메타분석이라는 연구 방법과 연구분야 자체의 진실성(integrity)을 위한 기준이 된다.
Hackshaw et al., (1997)는 간접흡연과 폐암과의 관계에 대한 메타분석을 실시하였으며, 그 결과 흡연 배우자를 둔 비흡연 배우자의 간접흡연으로 인한 폐암 발생률이 \(24\%\) 더 높은 것으로 보고하였다. 그러나 효과가 큰 연구들은 작은 연구들에 비해 출판 될 가능성이 높고 따라서 연구에 포함되었겠지만, 효과크기가 작거나 효과가 없는 연구들은 출판될 가능성이 낮아서 연구에 포함되지 못했기 때문에 이러한 결과가 도출되었다는 의견이 제기되었다. 그래서 이러한 이의에 대한 검정이 필요하다.
publi <- read.table(text='
study yi lower upper vi
study_1 -0.288 -0.84084 0.265475 0.079649
study_2 0.728 -0.20691 1.662006 0.227305
study_3 0.756 0.171673 1.340567 0.088916
study_4 -0.223 -1.08347 0.637175 0.192668
study_5 -0.236 -1.3769 0.905448 0.338993
study_6 0.698 0.084369 0.311897 0.09806
study_7 0.207 -0.21131 0.625334 0.045553
study_8 0.182 -0.76119 1.125838 0.231731
study_9 0.419 -0.1344 0.971824 0.079637
study_10 0.03 -0.88426 0.943388 0.217377
study_11 0.438 -0.10545 0.981966 0.076952
study_12 0.03 -0.49453 0.553638 0.071497
study_13 0.85 -0.20996 1.910264 0.292543
study_14 0.501 0.147782 0.853768 0.032435
study_15 0.174 -0.19933 0.547231 0.036271
study_16 0.419 -0.9461 1.782026 0.483819
study_17 0.77 0.080455 1.459759 0.123808
study_18 0.077 -0.44558 0.599512 0.071079
study_19 0.936 -0.30067 2.17861 0.398166
study_20 0.482 -0.10432 1.069173 0.089616
study_21 0.058 -0.30163 0.418171 0.033717
study_22 -0.236 -0.48464 0.013193 0.016128
study_23 -0.301 -1.13317 0.530963 0.180221
study_24 0.82 -0.28397 1.92353 0.317124
study_25 -0.03 -0.25 0.189074 0.012546
study_26 0.47 -0.19086 1.13087 0.113687
study_27 0.174 -0.41186 0.759763 0.089331
study_28 0.507 -0.31538 1.32902 0.175972
study_29 0.231 0.034836 0.42739 0.010028
study_30 0.095 -0.48017 0.670789 0.086208
study_31 0.507 0.115443 0.898192 0.039872
study_32 0.148 -0.22551 0.522347 0.06397
study_33 0.104 -0.40075 0.609472 0.066414
study_34 0.166 -0.10305 0.434078 0.018775
study_35 0.372 0.015283 0.727838 0.033042
study_36 0.703 -0.73741 2.143606 0.540157
study_37 0.182 -0.11094 0.475588 0.022388
', header=T)
publi
## study yi lower upper vi
## 1 study_1 -0.288 -0.840840 0.265475 0.079649
## 2 study_2 0.728 -0.206910 1.662006 0.227305
## 3 study_3 0.756 0.171673 1.340567 0.088916
## 4 study_4 -0.223 -1.083470 0.637175 0.192668
## 5 study_5 -0.236 -1.376900 0.905448 0.338993
## 6 study_6 0.698 0.084369 0.311897 0.098060
## 7 study_7 0.207 -0.211310 0.625334 0.045553
## 8 study_8 0.182 -0.761190 1.125838 0.231731
## 9 study_9 0.419 -0.134400 0.971824 0.079637
## 10 study_10 0.030 -0.884260 0.943388 0.217377
## 11 study_11 0.438 -0.105450 0.981966 0.076952
## 12 study_12 0.030 -0.494530 0.553638 0.071497
## 13 study_13 0.850 -0.209960 1.910264 0.292543
## 14 study_14 0.501 0.147782 0.853768 0.032435
## 15 study_15 0.174 -0.199330 0.547231 0.036271
## 16 study_16 0.419 -0.946100 1.782026 0.483819
## 17 study_17 0.770 0.080455 1.459759 0.123808
## 18 study_18 0.077 -0.445580 0.599512 0.071079
## 19 study_19 0.936 -0.300670 2.178610 0.398166
## 20 study_20 0.482 -0.104320 1.069173 0.089616
## 21 study_21 0.058 -0.301630 0.418171 0.033717
## 22 study_22 -0.236 -0.484640 0.013193 0.016128
## 23 study_23 -0.301 -1.133170 0.530963 0.180221
## 24 study_24 0.820 -0.283970 1.923530 0.317124
## 25 study_25 -0.030 -0.250000 0.189074 0.012546
## 26 study_26 0.470 -0.190860 1.130870 0.113687
## 27 study_27 0.174 -0.411860 0.759763 0.089331
## 28 study_28 0.507 -0.315380 1.329020 0.175972
## 29 study_29 0.231 0.034836 0.427390 0.010028
## 30 study_30 0.095 -0.480170 0.670789 0.086208
## 31 study_31 0.507 0.115443 0.898192 0.039872
## 32 study_32 0.148 -0.225510 0.522347 0.063970
## 33 study_33 0.104 -0.400750 0.609472 0.066414
## 34 study_34 0.166 -0.103050 0.434078 0.018775
## 35 study_35 0.372 0.015283 0.727838 0.033042
## 36 study_36 0.703 -0.737410 2.143606 0.540157
## 37 study_37 0.182 -0.110940 0.475588 0.022388
fit<- metagen(yi,sqrt(vi),
data = publi[order(publi$vi),],
studlab = paste(study),
comb.fixed = TRUE,
comb.random = FALSE,
prediction = TRUE,
sm = "RR")
fit
## RR 95%-CI %W(fixed)
## study_29 1.2599 [1.0353; 1.5331] 13.9
## study_25 0.9704 [0.7792; 1.2087] 11.1
## study_22 0.7898 [0.6158; 1.0130] 8.6
## study_34 1.1806 [0.9025; 1.5443] 7.4
## study_37 1.1996 [0.8947; 1.6084] 6.2
## study_14 1.6504 [1.1595; 2.3490] 4.3
## study_35 1.4506 [1.0159; 2.0715] 4.2
## study_21 1.0597 [0.7394; 1.5188] 4.1
## study_15 1.1901 [0.8193; 1.7285] 3.8
## study_31 1.6603 [1.1226; 2.4556] 3.5
## study_7 1.2300 [0.8095; 1.8688] 3.1
## study_32 1.1595 [0.7063; 1.9035] 2.2
## study_33 1.1096 [0.6696; 1.8388] 2.1
## study_18 1.0800 [0.6405; 1.8213] 2.0
## study_12 1.0305 [0.6101; 1.7403] 1.9
## study_11 1.5496 [0.8997; 2.6690] 1.8
## study_9 1.5204 [0.8745; 2.6435] 1.7
## study_1 0.7498 [0.4312; 1.3036] 1.7
## study_30 1.0997 [0.6185; 1.9552] 1.6
## study_3 2.1297 [1.1872; 3.8207] 1.6
## study_27 1.1901 [0.6625; 2.1378] 1.6
## study_20 1.6193 [0.9006; 2.9117] 1.6
## study_6 2.0097 [1.0879; 3.7127] 1.4
## study_26 1.6000 [0.8263; 3.0983] 1.2
## study_17 2.1598 [1.0837; 4.3044] 1.1
## study_28 1.6603 [0.7297; 3.7780] 0.8
## study_23 0.7401 [0.3220; 1.7007] 0.8
## study_4 0.8001 [0.3385; 1.8914] 0.7
## study_10 1.0305 [0.4132; 2.5697] 0.6
## study_2 2.0709 [0.8135; 5.2722] 0.6
## study_8 1.1996 [0.4670; 3.0817] 0.6
## study_13 2.3396 [0.8105; 6.7537] 0.5
## study_24 2.2705 [0.7530; 6.8464] 0.4
## study_5 0.7898 [0.2523; 2.4723] 0.4
## study_19 2.5498 [0.7403; 8.7824] 0.3
## study_16 1.5204 [0.3890; 5.9435] 0.3
## study_36 2.0198 [0.4783; 8.5291] 0.3
##
## Number of studies combined: k = 37
##
## RR 95%-CI z p-value
## Fixed effect model 1.2048 [1.1199; 1.2962] 5.00 < 0.0001
## Prediction interval [0.9350; 1.6424]
##
## Quantifying heterogeneity:
## tau^2 = 0.0170 [0.0000; 0.0680]; tau = 0.1305 [0.0000; 0.2607]
## I^2 = 24.2% [0.0%; 49.8%]; H = 1.15 [1.00; 1.41]
##
## Test of heterogeneity:
## Q d.f. p-value
## 47.49 36 0.0952
##
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau
비뚤림이 존재하는지 살펴보는 가장 좋은 출발점은 forest plot으로 메타분석 결과를 검토해보는 것이다. 여기서는 ’small-study effects’가 존재하는지 살펴보기 위해 자료를 분산 크기순으로 정렬하여 분석하였다(publi[order(publi$vi),]).
forest(fit)
각 개별연구들의 결과(효과크기 및 통계적 유의성)와 패턴, 그리고 전체 연구 결과의 모습(평균효과크기 및 통계적 유의성)을 보여준다. 그림의 아래쪽에 있는 가중치가 작은 연구들 즉, 표본의 크기가 작은 연구들이 대체로 효과크기가 큰 것으로 나타났음을 알 수 있으며, 이는 ’small-study effects’가 존재할 가능성이 있음을 시사한다.
Funnel plot은 meta package에서 funnel 함수를 이용하여 출력한다. 이때 funnel 함수의 첫번째 인수는 메타분석 결과를 담은 object를 사용한다.
funnel(fit,comb.fixed=T, comb.random=F)
\(X\)축에는 효과크기, \(Y\)축에는 표준오차를 사용하여 표본크기가 작은 연구들이 그래프 하단에 보다 폭넓게 위치할 수 있다. 그리고 relative risk=1.0을 기준으로 볼때 주로 오른쪽에 위치하고 있어 비대칭(asymmetry)임을 육안으로 비교적 쉽게 확인할 수 있다. 하지만 funnel plot은 오류에 대한 증명이 아니라 비뚤림의 가능성(possibility of bias)을 제기하기 위한 도구이며, ’small-study effects’를 검토하기 위한 하나의 일반적인 수단(generic means)이라고 보는 것이 타당하다.
Funnel plot을 통해 효과크기의 분포가 비대칭음을 쉽게 알 수 있지만, 시각적 분석은 주관적 판단에 의존하기 때문에 엄격한 방법이 될 수 없으므로 보다 과학적인 통계적 분석이 필요하다. 이때 일반적으로 활용되는 방법이 Egger’s regression test가 있으며 metabias 함수를 이용한다.
metabias(fit, method.bias="linreg")
## Linear regression test of funnel plot asymmetry
##
## Test result: t = 2.35, df = 35, p-value = 0.0248
##
## Sample estimates:
## bias se.bias intercept se.intercept
## 0.8824 0.3762 0.0101 0.0853
##
## Details:
## - multiplicative residual heterogeneity variance (tau^2 = 1.1727)
## - predictor: standard error
## - weight: inverse variance
## - reference: Egger et al. (1997), BMJ
Egger et al., (1997)는 각 연구의 효과크기와 표준오차와의 관계를 회귀식으로 설명하고 있으며, 위의 결과는 bias의 \(p-value\)가 0.0248로 유의수준 \(5\%\)에서 유의함을 알 수 있다. 즉 효과크기와 표준오차는 관계가 없다는 귀무가설(bias=0, no small-study effects)을 기각하게 되어 효과크기와 표준오차의 관계는 통계적으로 유의미한 관계가 있다고 말할 수 있다. 즉, 전반적으로 표본의 크기가 작은 연구들은 큰 연구들보다 간접흡연과 폐암 사이의 관계 곧 효과크기가 크다는 것을 보여주고 있기 때문에 통계적으로도 funnel plot의 비대칭을 증명하게 된다.
Funnel plot의 비대칭성을 검증하기 위한 또 다른 방법으로 Begg & Mazumdar (1994)의 rank correlation test를 이용할 수 있다. 이 방법은 효과크기와 분산과의 서열상관관계를 검증하기 때문에 Egger의 regression test보다 검증력이 약한 것으로 평가되어 널리 사용되지는 않는다. 이 방법 역시 metabias 함수를 이용하여 사용할 수 있다.
metabias(fit, method.bias="rank")
## Rank correlation test of funnel plot asymmetry
##
## Test result: z = 1.23, p-value = 0.2189
##
## Sample estimates:
## ks se.ks
## 94.0000 76.4591
##
## - reference: Begg & Mazumdar (1993), Biometrics
메타분석에서는 전체 분석 결과의 오류 검정에 대한 분석 방법으로 출판 비뚤림 분석과 더불어 ‘누적메타분석’과 ‘민감도분석’이 많이 활용된다. 누적메타분석(cumulative meta-analysis)은 시간의 흐름에 따라 연구 결과나 트렌드가 어떻게 달라지는가를 추적하는 분석 방법이다. 즉, 출판연도별로 정렬하여 시간이 경과함에 따라 효과크기가 어떻게 변화하는지 분석할 수 있다. 또 다른 방법은 연구의 정밀성, 즉 표본이 큰 연구들로부터 차례로 투입하여 효과크기가 어떻게 달라지는지를 분석할 수 있다.
시간적 순서에 따른 누적메타분석을 위해 일차진료기관에서 우울증에 대한 전통적인 치료방법과 여러 전문가를 참여시킨 연합적 치료방법(collaborative care)의 치료효과를 비교한 35개 연구를 살펴보자(Gilbody et al., 2006).
cum <- read.table(text='
study yi vi setting year
"Adler et al, 31(2004)" 0.19 0.01 1 2004
"Akerblad et al, 32(2003)" 0.26 0.009 0 2003
"Araya et al, 33(2003)" 1.13 0.03 0 2003
"Blanchard et al, 34(1995)" 0.43 0.05 0 1995
"Brook et al, 35(2003)" 0 0.03 0 2003
"Bruce et al, 36(2004)" 0.3 0.013 1 2004
"Callahan et al, 37(1994)" 0.05 0.073 1 1994
"Cappocia et al, 38(2004)" 0.17 0.079 1 2004
"Coleman et al, 39(1999)" -0.14 0.04 1 1999
"Datto et al, 40(2003)" 0.42 0.082 1 2003
"Dietrich et al, 41(2004)" 0.16 0.014 1 2004
"Finley et al, 42(2000)" -0.3 0.075 1 2000
"Hunkeler et al, 43(2000)" 0.28 0.016 1 2000
"Jarjoura et al, 44(2004)" 0.42 0.044 1 2004
"Katon et al, 45(2001)" 0.11 0.011 1 2001
"Katon et al, 46(2004)" 0.24 0.019 1 2004
"Katon et al, 47(1995)" 0.19 0.024 1 1995
"Katon et al, 47(1996)" 0.49 0.034 1 1996
"Katon et al, 48(1999)" 0.31 0.023 1 1999
"Katzelnick et al, 49(2000)" 0.43 0.011 1 2000
"Mann et al, 50(1998)" -0.08 0.011 0 1998
"Oslin et al, 51(2003)" 0.61 0.072 1 2003
"Peyeler et al, 16(1999)" 0.21 0.027 0 1999
"Rickles et al, 52(2004)" 0.25 0.1 1 2004
"Rost et al, 53(2001a)" 0.2 0.023 1 2001
"Rost et al, 53(2001b)" 0.29 0.029 1 2001
"Smion et al, 54(2000)" 0.3 0.013 1 2000
"Smion et al, 55(2004a)" 0.18 0.021 1 2004
"Smion et al, 55(2004b)" 0.33 0.021 1 2004
"Swindle et al, 56(2003)" 0.18 0.06 1 2003
"Unutzer et al, 57(2001)" 0.405 0.002 1 2001
"Wells et al, 17(2000 medication)" 0.22 0.015 1 2000
"Wells et al, 17(2000 therapy)" 0.22 0.014 1 2000
"Whooley et al, 58(2000)" 0.16 0.036 1 2000
"Wilkinson et al, 59(1993)" -0.29 0.066 0 1993
', header=T)
cum
## study yi vi setting year
## 1 Adler et al, 31(2004) 0.190 0.010 1 2004
## 2 Akerblad et al, 32(2003) 0.260 0.009 0 2003
## 3 Araya et al, 33(2003) 1.130 0.030 0 2003
## 4 Blanchard et al, 34(1995) 0.430 0.050 0 1995
## 5 Brook et al, 35(2003) 0.000 0.030 0 2003
## 6 Bruce et al, 36(2004) 0.300 0.013 1 2004
## 7 Callahan et al, 37(1994) 0.050 0.073 1 1994
## 8 Cappocia et al, 38(2004) 0.170 0.079 1 2004
## 9 Coleman et al, 39(1999) -0.140 0.040 1 1999
## 10 Datto et al, 40(2003) 0.420 0.082 1 2003
## 11 Dietrich et al, 41(2004) 0.160 0.014 1 2004
## 12 Finley et al, 42(2000) -0.300 0.075 1 2000
## 13 Hunkeler et al, 43(2000) 0.280 0.016 1 2000
## 14 Jarjoura et al, 44(2004) 0.420 0.044 1 2004
## 15 Katon et al, 45(2001) 0.110 0.011 1 2001
## 16 Katon et al, 46(2004) 0.240 0.019 1 2004
## 17 Katon et al, 47(1995) 0.190 0.024 1 1995
## 18 Katon et al, 47(1996) 0.490 0.034 1 1996
## 19 Katon et al, 48(1999) 0.310 0.023 1 1999
## 20 Katzelnick et al, 49(2000) 0.430 0.011 1 2000
## 21 Mann et al, 50(1998) -0.080 0.011 0 1998
## 22 Oslin et al, 51(2003) 0.610 0.072 1 2003
## 23 Peyeler et al, 16(1999) 0.210 0.027 0 1999
## 24 Rickles et al, 52(2004) 0.250 0.100 1 2004
## 25 Rost et al, 53(2001a) 0.200 0.023 1 2001
## 26 Rost et al, 53(2001b) 0.290 0.029 1 2001
## 27 Smion et al, 54(2000) 0.300 0.013 1 2000
## 28 Smion et al, 55(2004a) 0.180 0.021 1 2004
## 29 Smion et al, 55(2004b) 0.330 0.021 1 2004
## 30 Swindle et al, 56(2003) 0.180 0.060 1 2003
## 31 Unutzer et al, 57(2001) 0.405 0.002 1 2001
## 32 Wells et al, 17(2000 medication) 0.220 0.015 1 2000
## 33 Wells et al, 17(2000 therapy) 0.220 0.014 1 2000
## 34 Whooley et al, 58(2000) 0.160 0.036 1 2000
## 35 Wilkinson et al, 59(1993) -0.290 0.066 0 1993
자료를 연도순으로 정렬하면 다음과 같다.
cum <- cum[order(cum$year),]
head(cum, 10)
## study yi vi setting year
## 35 Wilkinson et al, 59(1993) -0.29 0.066 0 1993
## 7 Callahan et al, 37(1994) 0.05 0.073 1 1994
## 4 Blanchard et al, 34(1995) 0.43 0.050 0 1995
## 17 Katon et al, 47(1995) 0.19 0.024 1 1995
## 18 Katon et al, 47(1996) 0.49 0.034 1 1996
## 21 Mann et al, 50(1998) -0.08 0.011 0 1998
## 9 Coleman et al, 39(1999) -0.14 0.040 1 1999
## 19 Katon et al, 48(1999) 0.31 0.023 1 1999
## 23 Peyeler et al, 16(1999) 0.21 0.027 0 1999
## 12 Finley et al, 42(2000) -0.30 0.075 1 2000
fit<- metagen(yi,sqrt(vi),
data = cum,
studlab = paste(study),
comb.fixed = TRUE,
comb.random = FALSE,
prediction = TRUE,
sm = "SMD")
fit
## SMD 95%-CI %W(fixed)
## Wilkinson et al, 59(1993) -0.2900 [-0.7935; 0.2135] 0.7
## Callahan et al, 37(1994) 0.0500 [-0.4796; 0.5796] 0.7
## Blanchard et al, 34(1995) 0.4300 [-0.0083; 0.8683] 1.0
## Katon et al, 47(1995) 0.1900 [-0.1136; 0.4936] 2.0
## Katon et al, 47(1996) 0.4900 [ 0.1286; 0.8514] 1.4
## Mann et al, 50(1998) -0.0800 [-0.2856; 0.1256] 4.4
## Coleman et al, 39(1999) -0.1400 [-0.5320; 0.2520] 1.2
## Katon et al, 48(1999) 0.3100 [ 0.0128; 0.6072] 2.1
## Peyeler et al, 16(1999) 0.2100 [-0.1121; 0.5321] 1.8
## Finley et al, 42(2000) -0.3000 [-0.8368; 0.2368] 0.6
## Hunkeler et al, 43(2000) 0.2800 [ 0.0321; 0.5279] 3.0
## Katzelnick et al, 49(2000) 0.4300 [ 0.2244; 0.6356] 4.4
## Smion et al, 54(2000) 0.3000 [ 0.0765; 0.5235] 3.7
## Wells et al, 17(2000 medication) 0.2200 [-0.0200; 0.4600] 3.2
## Wells et al, 17(2000 therapy) 0.2200 [-0.0119; 0.4519] 3.5
## Whooley et al, 58(2000) 0.1600 [-0.2119; 0.5319] 1.4
## Katon et al, 45(2001) 0.1100 [-0.0956; 0.3156] 4.4
## Rost et al, 53(2001a) 0.2000 [-0.0972; 0.4972] 2.1
## Rost et al, 53(2001b) 0.2900 [-0.0438; 0.6238] 1.7
## Unutzer et al, 57(2001) 0.4050 [ 0.3173; 0.4927] 24.3
## Akerblad et al, 32(2003) 0.2600 [ 0.0741; 0.4459] 5.4
## Araya et al, 33(2003) 1.1300 [ 0.7905; 1.4695] 1.6
## Brook et al, 35(2003) 0.0000 [-0.3395; 0.3395] 1.6
## Datto et al, 40(2003) 0.4200 [-0.1412; 0.9812] 0.6
## Oslin et al, 51(2003) 0.6100 [ 0.0841; 1.1359] 0.7
## Swindle et al, 56(2003) 0.1800 [-0.3001; 0.6601] 0.8
## Adler et al, 31(2004) 0.1900 [-0.0060; 0.3860] 4.9
## Bruce et al, 36(2004) 0.3000 [ 0.0765; 0.5235] 3.7
## Cappocia et al, 38(2004) 0.1700 [-0.3809; 0.7209] 0.6
## Dietrich et al, 41(2004) 0.1600 [-0.0719; 0.3919] 3.5
## Jarjoura et al, 44(2004) 0.4200 [ 0.0089; 0.8311] 1.1
## Katon et al, 46(2004) 0.2400 [-0.0302; 0.5102] 2.6
## Rickles et al, 52(2004) 0.2500 [-0.3698; 0.8698] 0.5
## Smion et al, 55(2004a) 0.1800 [-0.1040; 0.4640] 2.3
## Smion et al, 55(2004b) 0.3300 [ 0.0460; 0.6140] 2.3
##
## Number of studies combined: k = 35
##
## SMD 95%-CI z p-value
## Fixed effect model 0.2757 [ 0.2325; 0.3190] 12.51 < 0.0001
## Prediction interval [-0.0583; 0.5532]
##
## Quantifying heterogeneity:
## tau^2 = 0.0213 [0.0071; 0.0618]; tau = 0.1458 [0.0843; 0.2486]
## I^2 = 54.1% [32.7%; 68.7%]; H = 1.48 [1.22; 1.79]
##
## Test of heterogeneity:
## Q d.f. p-value
## 74.10 34 < 0.0001
##
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau
forest(fit, layout="RevMan5")
meta packages에서 누적메타분석(cumulative meta-analysis)는 metacum 함수를 이용한다.
forest(metacum(fit), layout="RevMan5")
누적분석 결과를 살펴보면, 1990년대 중반 이후 특히 2000년대에 들어서면서 연합적 치료방법의 효과가 전통적인 치료방법에 비해 긍정적이면서 안정적인 결과(0.20~0.28)를 보여주고 있음을 알 수 있다.
누적메타분석은 시간의 흐름에 따라 결과가 어떻게 축적되어 나타나는지를 검증하는 방법으로 고안되었지만 표본크기가 큰 연구부터 투입하여 효과크기가 어떻게 변화하는지를 분석할 수 있다. 즉, 표본크기가 큰 연구들부터 차례로 투입함으로써 효과크기가 어느 정도 안정화(stabilized)되면 표본크기가 작은 연구들을 더 투입해도 효과크기에 큰 변화가 나타나지 않는지를 확인한다. 만약 그렇게 되면 작은 연구들이 전체효과크기에 영향을 미친다고 보기 어렵다.
앞서 사용한 간접흡연이 배우자의 폐암 발생에 미치는 영향을 분석한 자료로 살펴보자.
meta packages에서 누적메타분석(cumulative meta-analysis)는 metacum 함수를 이용한다.
publi <- read.table(text='
study yi lower upper vi
study_1 -0.288 -0.84084 0.265475 0.079649
study_2 0.728 -0.20691 1.662006 0.227305
study_3 0.756 0.171673 1.340567 0.088916
study_4 -0.223 -1.08347 0.637175 0.192668
study_5 -0.236 -1.3769 0.905448 0.338993
study_6 0.698 0.084369 0.311897 0.09806
study_7 0.207 -0.21131 0.625334 0.045553
study_8 0.182 -0.76119 1.125838 0.231731
study_9 0.419 -0.1344 0.971824 0.079637
study_10 0.03 -0.88426 0.943388 0.217377
study_11 0.438 -0.10545 0.981966 0.076952
study_12 0.03 -0.49453 0.553638 0.071497
study_13 0.85 -0.20996 1.910264 0.292543
study_14 0.501 0.147782 0.853768 0.032435
study_15 0.174 -0.19933 0.547231 0.036271
study_16 0.419 -0.9461 1.782026 0.483819
study_17 0.77 0.080455 1.459759 0.123808
study_18 0.077 -0.44558 0.599512 0.071079
study_19 0.936 -0.30067 2.17861 0.398166
study_20 0.482 -0.10432 1.069173 0.089616
study_21 0.058 -0.30163 0.418171 0.033717
study_22 -0.236 -0.48464 0.013193 0.016128
study_23 -0.301 -1.13317 0.530963 0.180221
study_24 0.82 -0.28397 1.92353 0.317124
study_25 -0.03 -0.25 0.189074 0.012546
study_26 0.47 -0.19086 1.13087 0.113687
study_27 0.174 -0.41186 0.759763 0.089331
study_28 0.507 -0.31538 1.32902 0.175972
study_29 0.231 0.034836 0.42739 0.010028
study_30 0.095 -0.48017 0.670789 0.086208
study_31 0.507 0.115443 0.898192 0.039872
study_32 0.148 -0.22551 0.522347 0.06397
study_33 0.104 -0.40075 0.609472 0.066414
study_34 0.166 -0.10305 0.434078 0.018775
study_35 0.372 0.015283 0.727838 0.033042
study_36 0.703 -0.73741 2.143606 0.540157
study_37 0.182 -0.11094 0.475588 0.022388
', header=T)
publi
## study yi lower upper vi
## 1 study_1 -0.288 -0.840840 0.265475 0.079649
## 2 study_2 0.728 -0.206910 1.662006 0.227305
## 3 study_3 0.756 0.171673 1.340567 0.088916
## 4 study_4 -0.223 -1.083470 0.637175 0.192668
## 5 study_5 -0.236 -1.376900 0.905448 0.338993
## 6 study_6 0.698 0.084369 0.311897 0.098060
## 7 study_7 0.207 -0.211310 0.625334 0.045553
## 8 study_8 0.182 -0.761190 1.125838 0.231731
## 9 study_9 0.419 -0.134400 0.971824 0.079637
## 10 study_10 0.030 -0.884260 0.943388 0.217377
## 11 study_11 0.438 -0.105450 0.981966 0.076952
## 12 study_12 0.030 -0.494530 0.553638 0.071497
## 13 study_13 0.850 -0.209960 1.910264 0.292543
## 14 study_14 0.501 0.147782 0.853768 0.032435
## 15 study_15 0.174 -0.199330 0.547231 0.036271
## 16 study_16 0.419 -0.946100 1.782026 0.483819
## 17 study_17 0.770 0.080455 1.459759 0.123808
## 18 study_18 0.077 -0.445580 0.599512 0.071079
## 19 study_19 0.936 -0.300670 2.178610 0.398166
## 20 study_20 0.482 -0.104320 1.069173 0.089616
## 21 study_21 0.058 -0.301630 0.418171 0.033717
## 22 study_22 -0.236 -0.484640 0.013193 0.016128
## 23 study_23 -0.301 -1.133170 0.530963 0.180221
## 24 study_24 0.820 -0.283970 1.923530 0.317124
## 25 study_25 -0.030 -0.250000 0.189074 0.012546
## 26 study_26 0.470 -0.190860 1.130870 0.113687
## 27 study_27 0.174 -0.411860 0.759763 0.089331
## 28 study_28 0.507 -0.315380 1.329020 0.175972
## 29 study_29 0.231 0.034836 0.427390 0.010028
## 30 study_30 0.095 -0.480170 0.670789 0.086208
## 31 study_31 0.507 0.115443 0.898192 0.039872
## 32 study_32 0.148 -0.225510 0.522347 0.063970
## 33 study_33 0.104 -0.400750 0.609472 0.066414
## 34 study_34 0.166 -0.103050 0.434078 0.018775
## 35 study_35 0.372 0.015283 0.727838 0.033042
## 36 study_36 0.703 -0.737410 2.143606 0.540157
## 37 study_37 0.182 -0.110940 0.475588 0.022388
publi2 <- publi[order(publi$vi),]
fit_pub2<- metagen(yi,sqrt(vi),
data = publi2,
studlab = paste(study),
comb.fixed = TRUE,
comb.random = FALSE,
prediction = TRUE,
sm = "RR")
fit_pub2
## RR 95%-CI %W(fixed)
## study_29 1.2599 [1.0353; 1.5331] 13.9
## study_25 0.9704 [0.7792; 1.2087] 11.1
## study_22 0.7898 [0.6158; 1.0130] 8.6
## study_34 1.1806 [0.9025; 1.5443] 7.4
## study_37 1.1996 [0.8947; 1.6084] 6.2
## study_14 1.6504 [1.1595; 2.3490] 4.3
## study_35 1.4506 [1.0159; 2.0715] 4.2
## study_21 1.0597 [0.7394; 1.5188] 4.1
## study_15 1.1901 [0.8193; 1.7285] 3.8
## study_31 1.6603 [1.1226; 2.4556] 3.5
## study_7 1.2300 [0.8095; 1.8688] 3.1
## study_32 1.1595 [0.7063; 1.9035] 2.2
## study_33 1.1096 [0.6696; 1.8388] 2.1
## study_18 1.0800 [0.6405; 1.8213] 2.0
## study_12 1.0305 [0.6101; 1.7403] 1.9
## study_11 1.5496 [0.8997; 2.6690] 1.8
## study_9 1.5204 [0.8745; 2.6435] 1.7
## study_1 0.7498 [0.4312; 1.3036] 1.7
## study_30 1.0997 [0.6185; 1.9552] 1.6
## study_3 2.1297 [1.1872; 3.8207] 1.6
## study_27 1.1901 [0.6625; 2.1378] 1.6
## study_20 1.6193 [0.9006; 2.9117] 1.6
## study_6 2.0097 [1.0879; 3.7127] 1.4
## study_26 1.6000 [0.8263; 3.0983] 1.2
## study_17 2.1598 [1.0837; 4.3044] 1.1
## study_28 1.6603 [0.7297; 3.7780] 0.8
## study_23 0.7401 [0.3220; 1.7007] 0.8
## study_4 0.8001 [0.3385; 1.8914] 0.7
## study_10 1.0305 [0.4132; 2.5697] 0.6
## study_2 2.0709 [0.8135; 5.2722] 0.6
## study_8 1.1996 [0.4670; 3.0817] 0.6
## study_13 2.3396 [0.8105; 6.7537] 0.5
## study_24 2.2705 [0.7530; 6.8464] 0.4
## study_5 0.7898 [0.2523; 2.4723] 0.4
## study_19 2.5498 [0.7403; 8.7824] 0.3
## study_16 1.5204 [0.3890; 5.9435] 0.3
## study_36 2.0198 [0.4783; 8.5291] 0.3
##
## Number of studies combined: k = 37
##
## RR 95%-CI z p-value
## Fixed effect model 1.2048 [1.1199; 1.2962] 5.00 < 0.0001
## Prediction interval [0.9350; 1.6424]
##
## Quantifying heterogeneity:
## tau^2 = 0.0170 [0.0000; 0.0680]; tau = 0.1305 [0.0000; 0.2607]
## I^2 = 24.2% [0.0%; 49.8%]; H = 1.15 [1.00; 1.41]
##
## Test of heterogeneity:
## Q d.f. p-value
## 47.49 36 0.0952
##
## Details on meta-analytical method:
## - Inverse variance method
## - DerSimonian-Laird estimator for tau^2
## - Jackson method for confidence interval of tau^2 and tau
forest(metacum(fit_pub2, sortvar=publi2$vi) )
연구 크기순으로 22개(study 20까지) 연구를 투입했을 때(이때 누적가중치는 \(90\%\)에 달하는데) 전체효과크기는 1.17로 나타났다. 그리고 나머지 15개의 상대적으로 작은 연구들을 투입하여도 전체효과크기는 1.20으로 조금 증가해 전체 결과에 큰 영향을 미치지는 못하는 것으로 나타났따. 따라서 효과의 크기가 큰 것으로 나타난 작은 표본의 연구들이 전체 결과에 영향을 주는, 즉 비뚤림을 일으키는 원인이라고 말할 수 없다고 하겠다.
요약하면 누적메타분석은 각 연구들이 더해지면서 평균효과크기와 신뢰구간이 어떻게 달라지는 지를 보여준다. 그리고 누적메타분석은 민감도분석의 한 부분으로도 활용될 수 있어 새로운 연구들이 추가되면서 연구 결과(결론)가 어떻게 달라지는지 또는 변함이 없는지를 보여준다.
민감도분석(sensitivity analysis)은 분석의 기준이나 내용에 따라 그 결과가 어떻게(민감하게) 변화하는지를 검토하는 분석 방법으로, 그 기준은 다음과 같다.
| 기준 | 내용 |
|---|---|
| 연구 포함 기준 | 기준에 따라 어떤 특정한 연구나 몇몇 연구가 누락되게 되면 전체적인 결론이 크게 다른게 나타나는가를 검증한다. |
| 통계적 방법 | 효과크기의 종류(risk ratio 또는 odds ratio), 효과크기의 산출 모형(고정효과모형 또는 랜덤효과모형) |
| 누락된 데이터를 다루는 방법 | 누락된 연구를 포함시켰을 때 결과가 어느 정도 달라지는가를 검층한다(예: trim-and fill) |
민감도분석은 서로 다른 조건(가정)하에서 도출된 분석 결과가 일관성을 보이는지 검증하는 방법이라고 할 수 있다. 즉 체계적 리뷰 과정에서 이루어진 여러 가지 결정의 영향력을 검증하기 위해 그리고 누락된 데이터의 영향을 탐색하기 위해 사용할 수 있다.
## Extensive documentation for the dmetar package can be found at:
## www.bookdown.org/MathiasHarrer/Doing_Meta_Analysis_in_R/
madata <- read.table(text='
Author TE seTE
"Call et al." 0.7091 0.2608
"Cavanagh et al." 0.3549 0.1964
"DanitzOrsillo" 1.7912 0.3456
"de Vibe et al." 0.1825 0.1178
"Frazier et al." 0.4219 0.1448
"Frogeli et al." 0.6300 0.1960
"Gallego et al." 0.7249 0.2247
"Hazlett-Stevens & Oren" 0.5287 0.2105
"Hintz et al." 0.2840 0.1680
"Kang et al." 1.2751 0.3372
"Kuhlmann et al." 0.1036 0.1947
"Lever Taylor et al." 0.3884 0.2308
"Phang et al." 0.5407 0.2443
"Rasanen et al." 0.4262 0.2579
"Ratanasiripong" 0.5154 0.3513
"Shapiro et al." 1.4797 0.3153
"SongLindquist" 0.6126 0.2267
"Warnecke et al." 0.6000 0.2490
', header=T)
madata
## Author TE seTE
## 1 Call et al. 0.7091 0.2608
## 2 Cavanagh et al. 0.3549 0.1964
## 3 DanitzOrsillo 1.7912 0.3456
## 4 de Vibe et al. 0.1825 0.1178
## 5 Frazier et al. 0.4219 0.1448
## 6 Frogeli et al. 0.6300 0.1960
## 7 Gallego et al. 0.7249 0.2247
## 8 Hazlett-Stevens & Oren 0.5287 0.2105
## 9 Hintz et al. 0.2840 0.1680
## 10 Kang et al. 1.2751 0.3372
## 11 Kuhlmann et al. 0.1036 0.1947
## 12 Lever Taylor et al. 0.3884 0.2308
## 13 Phang et al. 0.5407 0.2443
## 14 Rasanen et al. 0.4262 0.2579
## 15 Ratanasiripong 0.5154 0.3513
## 16 Shapiro et al. 1.4797 0.3153
## 17 SongLindquist 0.6126 0.2267
## 18 Warnecke et al. 0.6000 0.2490
m.hksj <- metagen(TE,
seTE,
data = madata,
studlab = paste(Author),
comb.fixed = FALSE,
comb.random = TRUE,
method.tau = "SJ",
hakn = TRUE,
prediction = TRUE,
sm = "SMD")
m.hksj
## SMD 95%-CI %W(random)
## Call et al. 0.7091 [ 0.1979; 1.2203] 5.2
## Cavanagh et al. 0.3549 [-0.0300; 0.7398] 6.1
## DanitzOrsillo 1.7912 [ 1.1138; 2.4686] 4.2
## de Vibe et al. 0.1825 [-0.0484; 0.4134] 7.1
## Frazier et al. 0.4219 [ 0.1381; 0.7057] 6.8
## Frogeli et al. 0.6300 [ 0.2458; 1.0142] 6.1
## Gallego et al. 0.7249 [ 0.2845; 1.1653] 5.7
## Hazlett-Stevens & Oren 0.5287 [ 0.1161; 0.9413] 5.9
## Hintz et al. 0.2840 [-0.0453; 0.6133] 6.5
## Kang et al. 1.2751 [ 0.6142; 1.9360] 4.3
## Kuhlmann et al. 0.1036 [-0.2780; 0.4852] 6.1
## Lever Taylor et al. 0.3884 [-0.0640; 0.8408] 5.6
## Phang et al. 0.5407 [ 0.0619; 1.0195] 5.4
## Rasanen et al. 0.4262 [-0.0793; 0.9317] 5.3
## Ratanasiripong 0.5154 [-0.1731; 1.2039] 4.1
## Shapiro et al. 1.4797 [ 0.8617; 2.0977] 4.5
## SongLindquist 0.6126 [ 0.1683; 1.0569] 5.7
## Warnecke et al. 0.6000 [ 0.1120; 1.0880] 5.4
##
## Number of studies combined: k = 18
##
## SMD 95%-CI t p-value
## Random effects model 0.5935 [ 0.3892; 0.7979] 6.13 < 0.0001
## Prediction interval [-0.2083; 1.3954]
##
## Quantifying heterogeneity:
## tau^2 = 0.1337 [0.0295; 0.3533]; tau = 0.3656 [0.1717; 0.5944]
## I^2 = 62.6% [37.9%; 77.5%]; H = 1.64 [1.27; 2.11]
##
## Test of heterogeneity:
## Q d.f. p-value
## 45.50 17 0.0002
##
## Details on meta-analytical method:
## - Inverse variance method
## - Sidik-Jonkman estimator for tau^2
## - Q-profile method for confidence interval of tau^2 and tau
## - Hartung-Knapp adjustment for random effects model
forest(m.hksj )
inf.analysis <- InfluenceAnalysis(x = m.hksj,
random = TRUE)
## [===========================================================================] DONE
summary(inf.analysis)
## Leave-One-Out Analysis (Sorted by I2)
## -----------------------------------
## Effect LLCI ULCI I2
## Omitting DanitzOrsillo 0.527 0.362 0.691 0.481
## Omitting Shapiro et al. 0.544 0.358 0.731 0.545
## Omitting de Vibe et al. 0.624 0.414 0.835 0.576
## Omitting Kang et al. 0.560 0.360 0.761 0.598
## Omitting Kuhlmann et al. 0.624 0.417 0.831 0.614
## Omitting Hintz et al. 0.616 0.401 0.830 0.636
## Omitting Gallego et al. 0.588 0.370 0.806 0.638
## Omitting Call et al. 0.590 0.372 0.807 0.642
## Omitting Frogeli et al. 0.594 0.375 0.813 0.643
## Omitting Cavanagh et al. 0.611 0.394 0.827 0.645
## Omitting SongLindquist 0.595 0.376 0.814 0.646
## Omitting Warnecke et al. 0.596 0.377 0.814 0.646
## Omitting Frazier et al. 0.608 0.390 0.826 0.647
## Omitting Lever Taylor et al. 0.608 0.391 0.824 0.647
## Omitting Hazlett-Stevens & Oren 0.600 0.381 0.819 0.648
## Omitting Phang et al. 0.599 0.381 0.818 0.648
## Omitting Rasanen et al. 0.605 0.388 0.822 0.648
## Omitting Ratanasiripong 0.599 0.382 0.816 0.648
##
##
## Influence Diagnostics
## -------------------
## rstudent dffits cook.d cov.r QE.del hat
## Omitting Call et al. 0.253 0.038 0.001 1.114 44.700 0.052
## Omitting Cavanagh et al. -0.586 -0.163 0.027 1.101 45.060 0.061
## Omitting DanitzOrsillo 2.828 0.746 0.423 0.694 30.815 0.042
## Omitting de Vibe et al. -1.121 -0.304 0.091 1.058 37.740 0.071
## Omitting Frazier et al. -0.445 -0.137 0.020 1.120 45.311 0.068
## Omitting Frogeli et al. 0.082 -0.002 0.000 1.127 44.875 0.061
## Omitting Gallego et al. 0.302 0.053 0.003 1.118 44.254 0.057
## Omitting Hazlett-Stevens & Oren -0.160 -0.062 0.004 1.122 45.441 0.059
## Omitting Hintz et al. -0.790 -0.215 0.047 1.087 43.999 0.065
## Omitting Kang et al. 1.445 0.332 0.104 0.970 39.823 0.043
## Omitting Kuhlmann et al. -1.242 -0.301 0.087 1.025 41.492 0.061
## Omitting Lever Taylor et al. -0.483 -0.134 0.019 1.103 45.329 0.056
## Omitting Phang et al. -0.126 -0.053 0.003 1.118 45.433 0.054
## Omitting Rasanen et al. -0.381 -0.109 0.012 1.105 45.450 0.053
## Omitting Ratanasiripong -0.159 -0.055 0.003 1.101 45.486 0.041
## Omitting Shapiro et al. 2.037 0.516 0.230 0.867 35.203 0.045
## Omitting SongLindquist 0.039 -0.014 0.000 1.122 45.140 0.057
## Omitting Warnecke et al. 0.009 -0.021 0.000 1.119 45.257 0.054
## weight infl
## Omitting Call et al. 5.215
## Omitting Cavanagh et al. 6.106
## Omitting DanitzOrsillo 4.156 *
## Omitting de Vibe et al. 7.128
## Omitting Frazier et al. 6.801
## Omitting Frogeli et al. 6.112
## Omitting Gallego et al. 5.711
## Omitting Hazlett-Stevens & Oren 5.909
## Omitting Hintz et al. 6.497
## Omitting Kang et al. 4.252
## Omitting Kuhlmann et al. 6.130
## Omitting Lever Taylor et al. 5.626
## Omitting Phang et al. 5.440
## Omitting Rasanen et al. 5.254
## Omitting Ratanasiripong 4.091
## Omitting Shapiro et al. 4.513
## Omitting SongLindquist 5.683
## Omitting Warnecke et al. 5.375
##
##
## Baujat Diagnostics (sorted by Heterogeneity Contribution)
## -------------------------------------------------------
## HetContrib InfluenceEffectSize
## Omitting DanitzOrsillo 14.383 0.298
## Omitting Shapiro et al. 10.042 0.251
## Omitting de Vibe et al. 6.400 1.356
## Omitting Kang et al. 5.553 0.121
## Omitting Kuhlmann et al. 3.748 0.256
## Omitting Hintz et al. 1.368 0.129
## Omitting Gallego et al. 1.183 0.060
## Omitting Call et al. 0.768 0.028
## Omitting Frogeli et al. 0.582 0.039
## Omitting Cavanagh et al. 0.409 0.027
## Omitting SongLindquist 0.339 0.017
## Omitting Warnecke et al. 0.230 0.009
## Omitting Frazier et al. 0.164 0.021
## Omitting Lever Taylor et al. 0.159 0.008
## Omitting Phang et al. 0.061 0.003
## Omitting Hazlett-Stevens & Oren 0.052 0.003
## Omitting Rasanen et al. 0.044 0.002
## Omitting Ratanasiripong 0.010 0.000
Leave-one-out Analysis
plot(inf.analysis, "es")
즉 어떤 특정한 연구를 제외하거나 또는 포함시켰을 때 전체 평균효과크기가 어떻게 달라지며, 전체 연구 결과에 얼마나 변화가 있는지를 검증하는 것이 바로 민감도분석의 목적이다.
네트워크 메타분석(network meta-analysis, NMA)은 다중비교(multiple treatment meta-analysis) 또는 혼합비교(mixed treatment comparison)라고도 불리며, 다수의 치료(intervention 또는 treatment)를 가진 여러 연구들의 효과크기를 종합하는 것이다 (White, 2015).
기존의 일반적인 메타분석(pairwise meta-analysis)에서는 동일한 치료를 실시한 연구들을 모아 치료군과 비교군으로 두 군의 짝을 만든 후 효과크기를 직접 계산하였다. 그러나 네트워크 메타분석에서는 치료그룹별 직접비교 연구가 없거나 치료가 서로 다르다고 하더라도 간접비교(indirect treatment comparison) 방법을 이용하여 치료그룹 간의 효과크기를 계산할 수 있다.
International Society for Pharmacoeconomics and Outcomes Research (ISPOR) 에서는 근거가 2개 이상인 치료를 연결하는 2개 이상의 임상연구(randomized clinical trial)가 있는 경우에 네트워크 메타분석이라는 용어를 사용한다. 이때 네트워크가 열려 있어 loop를 구성하지 못하면 간접비교(indirect treatment comparison, ITC)를 제안하고, 네트워크가 닫혀 있어서 loop를 구성하면 혼합비교(mixed treatment comparison, MTC)를 제안하였다. (Jansen et al., 2011)
네트워크 메타분석을 실행하는 방법은 크게 베이지안(Bayesian) 방법과 빈도주의적(frequentist) 방법으로 나누어볼 수 있다. 두 통계법의 차이는 통계모형에 접근하는 근본적인 개념의 차이에서 기인하며 표본크기가 클 경우 동일한 결과를 나타낸다.
우선 기존 네트워크 메타분석에서 상대적으로 많이 시행되는 ‘베이지안 방법’은 사전에 알려진 정보(prior probasbility 또는 external information)를 바탕으로 현재의 자료에서 주어진 정보(present data)를 더하여 연구가설이 참(true)일 사후확률(posterior probability)을 산출하는 것이다. 따라서 베이지안 방법은 사전정보에 따라 연구가설이 참일 확률이 변할 수 있는 확률적인 접근이라고 할 수 있다.
반면에 빈도주의적 방법은 일반적인 통계이론에 근거하여 현재 주어진 자료가 무한히 반복되었을 때 연구가설이 기각되거나 받아들여질 유의확률이나 신뢰구간에 기반한다. 따라서 빈도주의적 방법은 외적 정보와 무관하며, 주어진 자료 내에서 연구가설이 참일 확률이 이미 특정되어 있어서 단지 이것이 받아들여지거나 기각될지를 유의수준으로 판단한다.
| 베이지안 방법 | 빈도주의적 방법 | |
|---|---|---|
| 기본개념(basic concept) | 베이지안 이론(Bayesian therorem) | 자료의 분포(distribution) |
| 사용되는 정보(information used) | 사전확률(prior probability) & 연구자료(present data) | 연구자료(present data only) |
| 불확실성 측정(uncertainty measurment) | 신용구간(credible interval, Crl) | 신뢰구간(confidence interval, CI) |
| 연구가설 검정(hypothesis testing) | 연구가설이 참일 확률, 즉 사후확률을 직접 계산함 | |
| 귀무가설을 기각함으로써 연구 가설을 증명 |
다수의 선행연구를 참조하고 다양한 약물의 효과크기를 통해서 실제 현상을 설명하기에는 베이지안 방법이 빈도주의적 방법보다 논리적이고 타당하다고 볼 수 있다. 그러나 베이지안 방법은 연구가설에서 사전확률이 확립되어 있지 않을 경우, 사전확률을 설정하는 문제가 본래 분석하고자 하는 연구가설 검정보다 오히려 더 복잡할 수 있다. 그렇기 때문에 일반 연구자들이 접근하기에는 많은 한계를 지닌다. 최근, 다수의 연구에서 빈도주의적 방법과 베이지안 방법을 적용하여 네트워크 메타분석을 실행한 결과가 다르지 않음을 보여준다.
일반적인 메타분석(pairwise meta-analysis)에서는 두 치료그룹 간의 직접비교(direct comparison)에 따른 효과크기(effect size)를 여러 연구에서 종합하여 계산하였다. 그러나 둘 이상의 치료그룹에서 특정 치료간의 직접비교가 없을 경우에는 간접비교를 사용하여 이를 계산할 수 있다. 특히 공통 비교인자 (common comparator)를 통한 간접비교를 보정된 간접비교(adjusted indirect treatment comparison, AITC)라고 하는데, 이는 네트워크 메타분석을 가능하게 해주는 기본적인 원리이다.
예를 들어, 치료(treatment)는 3개(A, B, C)이고 2개의 연구(AB, AC)가 있으며 각각의 효과크기는 d_AB와 d_AC이다. A를 공통비교인자로 설정하여 2개의 직접비교 효과크기를 활용하여 BC의 간접비교(AITC)를 계산한 효과크기와 분산은 다음과 같다.
아래 그림과 같이 3개 치료 그룹 간의 직접비교 연구가 있는 경우에는 닫힌 loop를 형성하고 있기 때문에 직접비교와 간접비교(AITC)를 종합한 혼합비교(mixed treatment comparison, MTC)를 계산할 수 있다. 혼합비교는 Lumley(2002)가 2-arm trials에서 활용 가능한 방법을 제시하였고 이를 바탕으로 Higgins et al., (2012)와 White et al., (2012) 등이 multi-arm trials로 발전시켰다. 혼합비교는 연구의 정밀성(precision)을 향상시킬 수 있으며 직접비교만을 활용한 연구보다 신뢰구간(confidence interval)을 더 좁게 나타낼 수 있다.
메타분석은 기본적으로 여러 연구들을 수리적으로 종합하는 통계적 방법론이기 때문에 사전에 여러 가정(assumption)들을 충족해야만 종합효과크기(overall effect size)의 타당성을 보여줄 수 있다. 더욱이 2개 이상의 치료를 연결하는 네트워크 메타분석의 경우에는 보다 엄격한 가정이 요구된다.
네트워크 메타분석의 가정은 크게 임상석 유사성(clinical similarity), 통계적 동질성(statistical non-heterogeneity), 논리적 이행성(transitivity), 그리고 효과크기들의 일관성(consistency)으로 구분할 수 있다. 특히 주요 논문들에서는 임상적 의미가 있는 연구들을 수집하였는지 확인하는 임상적 유사성과 통계적 검정이 가능한 일관성을 중점적으로 다루고 있다.
메타분석은 태생적으로 이질성 논쟁을 피할 수 없다. 따라서 동일 연구디자인 내에서라면 임상적 유사성 검정을 위하여 Cochrane 통계량이나 Higgins 등의 이질성 수치를 활용할 수 있다. 그러나 이것은 비단 네트워크 메타분석에서뿐만 아니라 일반적인 메타분석에서와 동일한 논쟁이므로 크게 차별점이 없다. 더욱이 네트워크 메타분석에서는 여러 치료법과 여러 연구디자인을 아울러야 하므로 결국 이행성을 검정하기 위한 일관성 가정이 초점이 되고 있다. 다시말하면, ‘일관성’이란 직접비교와 간접비교를 수렴하기 위한 특수한 경우의 이질성(special type of heterogeneity)이라고 할 수 있다. 따라서 이를 검정함으로써 네트워크 메타분석 결과의 유의함을 보여주고자 하는 것이다.
대상 연구들 간의 임상적, 방법론적 유사성을 나타내는 것이다. 일반적으로 PICO (population, Intervention, Comparison, Outcomes)를 통하여 대상연구 선정의 전체적인 흐름을 파악하게 되는데 대상연구들이 연구주제와 부합하며 전반적으로 임상적, 방법론적으로 유사하여야 한다. 예를 들면, 대상연구들 중에서 인구집단(population) 내 동일한 질환군을 대상으로 실시한 연구가 아니라면 유사성을 의심하여야 한다. 그러나 임상적 유사성은 연구의 전반적인 유사성이지 통계적으로 검정할 수 있는 것은 아니다.
임상적, 방법론적 유사성이 치료그룹과 연구들 간에 있어서 논리적으로 확장된 개념이라고 할 수 있다. 간단히 설명하자면 만약 세 가지 치료(A, B, C)를 비교한 연구의 효과크기가 \(A>B\) 그리고 \(B>C\) 라면 \(A>C\)가 논리적으로 타당한 것이다. 이러한 논리적 이행성은 네트워크 메타분석 내 모든 경우에서 지켜져야 한다.
앞서 살펴본 유사성과 이행성은 개념적으로 비슷하지만 상호 동일한 것은 아니다. 예를 들어 3개의 연구가 고혈압 환자 중에서 각각 AB는 severe군, AC는 moderate군, 그리고 BC는 mild군을 대상으로 실시되어졌다고 가정해보자. 모든 연구가 고혈압이라는 특정 인구집단이기에 임상적 유사성은 만족할지라도 논리적 이행성 가정은 성립되지 않는다. 왜냐하면 이미 개별연구 인구집단별로 효과크기의 차별이 존재하기 때문이다.
기본적으로 일관성은 혼합비교를 구현함에 있어서 직접비교와 간접비교를 통한 효과크기가 동일하다는 가정이다. 예를 들어 관심효과크기가 BC라면 우선 직접비교를 통한 효과크기 \(d_{BC}\)와 간접비교를 통한 효과크기 \(d_{BC}\)는 통계적으로 유의한 차이를 보이지 않아야 일관성 가정이 충족된다고 볼 수 있다. 또한 일관성 검정은 논리적 이행성 가정을 검정하는 통계적인 방법이라고도 할 수 있다.
Higgins는 multi-arm 네트워크 메타분석에 적용 가능한 비일관성(inconsistency, 즉 일관성을 보이지 않는 여러 경우) 모델에 대한 개념을 다음과 같이 두 가지로 폭넓게 정립하였다. 첫째, 혼합비교를 계산할 때 직접비교와 간접비교의 차이를(difference) 들 수 있는데, 이를 loof inconsistency라고 한다. 둘째 동일하게 관심 효과크기가 BC라면 연구디자인 (BC, ABC)에 따른 (difference)를 들 수 있는데, BC 디자인에서의 직접비교 값인 \(d_{BC}\)와 ABC 디자인에서의 직접비교 값인 \(d_{BC}\)의 차이를 design inconsistency라고 한다.
일반적인 메타분석(pairwise meta-analysis)을 확장한 개념인 PRISMA (preferred Reporting Items for Systematic Reviews and Meta-analyses) 네트워크 메타분석 체크리스트는 (Hutton et al., 2015) 기존 메타분석에 더하여 네트워크 메타분석에 추가적으로 요구되는 항목들을 잘 기술하고 있다. 1번 title에서부터 연구에 대한 이해관계를 규정한 27번 funding 항목까지 매우 상세히 설명하고 있어 네트워크 메타분석 연구를 실시하고자 하는 연구자들은 반드시 이를 참조하여야 한다. 본 연구에서는 이들 항목 중 특히 네트워크 메타분석에서 반드시 보고되어야 하는 항목들은 다음과 같다.
네트워크 지형도(network geometry)는 네트워크 메타분석에서 비교군 간의 관계를 도식화한 것이다. 네트워크 지형도의 질적 기술(qualitative description)은 일반적으로 네트워크 그래프(map or plot)로, 양적관계(quantitative metrics)는 각 치료별 가중값을 보여주는 기여도 그림(contribution plot)으로 보여주는 것이 일반적이다.
네트워크 메타분석의 기본 가정인 일관성을 검정하는 방법으로 두 가지 방법이 있다. 첫 번째 개별 치료별 접근(local approach)은 Bucher가 제시한 방법을 활용하여 각 치료별로 짝지어서(node-splitting) 직접비교와 간접비교의 차이를 통계적으로 검정하는 것이다. 두 번째 전체 모델별 접근(global approach)은 design by treatment interaction model을 사용하여 각각의 연구디자인별 비일관성 모델의 회귀계수를 계산한 후 Wald test로 전체 모델에 대한 회귀계수들의 선형성을 검정하는 것이다.
네트워크 메타분석의 유용한 장점 중의 하나는 각 치료별 누적확률(cumulative probability)을 활용하여 치료법 간의 비교 우선순위를 산출할 수 있다는 것이다. 일반적으로 SUCRA(surface under the cumulative ranking) 곡선으로 나타내어지며, 각 치료별로 best에서부터 worst까지 확률을 도식화하여 곡선 아래 면적이 넓을수록 우선순위가 높다고 판단할 수 있다.
bin_nma <- read.table(text='
study d n trt
"Alshryda 2013" 10 80 D
"Alshryda 2013" 26 81 A
"Barrachina 2016" 4 36 C
"Barrachina 2016" 14 37 A
"Benoni 2000" 9 20 C
"Benoni 2000" 15 19 A
"Benoni 2001" 4 18 B
"Benoni 2001" 8 20 A
"Claeys 2007" 1 20 B
"Claeys 2007" 6 20 A
"Fraval 2017" 1 50 C
"Fraval 2017" 6 51 A
"Husted 2003" 2 20 C
"Husted 2003" 7 20 A
"Hsu 2015" 2 30 C
"Hsu 2015" 9 30 A
"Johansson 2005" 8 47 B
"Johansson 2005" 23 53 A
"Kazemi 2010" 7 32 B
"Kazemi 2010" 15 32 A
"Lee 2013" 9 34 C
"Lee 2013" 20 34 A
"Lemay 2004" 6 20 C
"Lemay 2004" 13 19 A
"Martin 2014" 3 25 D
"Martin 2014" 5 25 A
"Niskanen 2005" 5 19 C
"Niskanen 2005" 8 20 A
"North 2016" 8 70 C
"North 2016" 12 69 D
"Rajesparan 2009" 3 36 B
"Rajesparan 2009" 10 37 A
"Wang 2016" 9 81 B
"Wang 2016" 10 38 A
"Wei 2014" 6 101 B
"Wei 2014" 26 100 A
"Xie 2016" 3 70 B
"Xie 2016" 4 70 D
"Xie 2016" 0 70 E
"Yi 2016" 8 50 B
"Yi 2016" 1 50 E
"Yi 2016" 19 50 A
"Yue 2014" 3 52 D
"Yue 2014" 11 49 A
', header=T)
bin_nma
## study d n trt
## 1 Alshryda 2013 10 80 D
## 2 Alshryda 2013 26 81 A
## 3 Barrachina 2016 4 36 C
## 4 Barrachina 2016 14 37 A
## 5 Benoni 2000 9 20 C
## 6 Benoni 2000 15 19 A
## 7 Benoni 2001 4 18 B
## 8 Benoni 2001 8 20 A
## 9 Claeys 2007 1 20 B
## 10 Claeys 2007 6 20 A
## 11 Fraval 2017 1 50 C
## 12 Fraval 2017 6 51 A
## 13 Husted 2003 2 20 C
## 14 Husted 2003 7 20 A
## 15 Hsu 2015 2 30 C
## 16 Hsu 2015 9 30 A
## 17 Johansson 2005 8 47 B
## 18 Johansson 2005 23 53 A
## 19 Kazemi 2010 7 32 B
## 20 Kazemi 2010 15 32 A
## 21 Lee 2013 9 34 C
## 22 Lee 2013 20 34 A
## 23 Lemay 2004 6 20 C
## 24 Lemay 2004 13 19 A
## 25 Martin 2014 3 25 D
## 26 Martin 2014 5 25 A
## 27 Niskanen 2005 5 19 C
## 28 Niskanen 2005 8 20 A
## 29 North 2016 8 70 C
## 30 North 2016 12 69 D
## 31 Rajesparan 2009 3 36 B
## 32 Rajesparan 2009 10 37 A
## 33 Wang 2016 9 81 B
## 34 Wang 2016 10 38 A
## 35 Wei 2014 6 101 B
## 36 Wei 2014 26 100 A
## 37 Xie 2016 3 70 B
## 38 Xie 2016 4 70 D
## 39 Xie 2016 0 70 E
## 40 Yi 2016 8 50 B
## 41 Yi 2016 1 50 E
## 42 Yi 2016 19 50 A
## 43 Yue 2014 3 52 D
## 44 Yue 2014 11 49 A
베이지안 네트워크 메타분석을 실행하기 위해 gemtc 패키지를 이용한다. 또한 MCMC를 위해 JAGS를 이용하므로 JAGS(http://mcmc-jags.sourceforge.net/) 프로그램을 별도로 설치해야 한다.
#install.packages("gemtc")
library(gemtc)
## Loading required package: coda
##
## Attaching package: 'gemtc'
## The following object is masked from 'package:dmetar':
##
## sucra
## The following object is masked from 'package:meta':
##
## forest
gemtc package는 여러 함수를 포함하고 있으며, 그 중 네트워크 분석을 실행하는 mtc.network 함수는 함수의 인수가 특정 변수명이어야 실행 가능하다. 이산형 자료에서는 순서대로 이벤트 수를 나타내는 “responders”와 표본크기인 “sampleSize” 변수명이 일치해야 한다. 따라서 이를 위해 column 명을 변경한다.
colnames(bin_nma) <- c("study", "responders", "sampleSize", "treatment")
colnames(bin_nma)
## [1] "study" "responders" "sampleSize" "treatment"
다음으로 네트워크 plot에서 treatment를 상세히 보여주고 이를 네트워크 셋업으로 활용하기 위해 treatment 데이터셋을 설정한다.
treatment <- read.table(text='
id description
A "Placebo"
B "IV(single)"
C "IV(double)"
D "Topical"
E "Combination"
', header=T)
데이터셋 bin_nma와 treatment를 이용하여 네트워크 셋업을 시행한다. 이때 함수는 mtc.network를 이용한다.
network <- mtc.network(data.ab=bin_nma, treatments=treatment, description="Bayesian NMA")
셋업된 네트워크 정보를 network에 저장하고 plot 함수를 이용해 간단하게 네트워크 plot을 출력한다.
plot(network, use.description=T)
네트워크 plot은 네트워크를 구성하는 치료그룹 간의 직접비교(direct comparison) 관계를 도식화해서 보여준다. 각 node를 연결하는 엣지(edge)의 굵기는 수행된 연구 수를 의미한다. 네트워크 plot은 네트워크 메타분석 연구에서 치료 간의 질적, 양적 관계를 가늠할 수 있게 해주므로 반드시 제시되어야 한다.
library(igraph)
##
## Attaching package: 'igraph'
## The following objects are masked from 'package:stats':
##
## decompose, spectrum
## The following object is masked from 'package:base':
##
## union
plot(network, layout=igraph::layout.fruchterman.reingold, use.description=T)
위의 예제와 같이 igraph 패키지를 이용하면 네트워크 plot을 좀 더 다양하게 표현하는 것이 가능하다.
summary(network)
## $Description
## [1] "MTC dataset: Bayesian NMA"
##
## $`Studies per treatment`
## A B C D E
## 19 9 9 5 2
##
## $`Number of n-arm studies`
## 2-arm 3-arm
## 19 2
##
## $`Studies per treatment comparison`
## t1 t2 nr
## 1 A B 8
## 2 A C 8
## 3 A D 3
## 4 A E 1
## 5 B D 1
## 6 B E 2
## 7 C D 1
## 8 D E 1
summary 명령어를 실시하면 결과창에서 네트워크 셋업의 전반적인 상황을 볼 수 있다. 각 치료별 2-arm 또는 3-arm 연구의 개수와 치료별 대응개수도 알 수 있다. 즉, 네트워크 plot을 수치적으로 나타낸 결과이다.
네트워크 셋업 후 고정효과모형(fixed effect model) 또는 랜덤효과모형(random effect model)으로 네트워크 모델을 설정한다. 이때 함수 mtc.model을 이용한다.
model_fix <- mtc.model(network, linearModel='fixed', n.chain=4, likelihood='binom', link='logit') # Fixed effect model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
mtc.model 함수에 네트워크 셋업 데이터 network를 불러들여 고정효과모형 또는 랜덤효과모형으로 설정하여 각각 model_fix와 model_ran으로 저장한다. 여기서 n.chain은 MCMC에서 사용할 chain 수를 나타낸다.
model_ran <- mtc.model(network, linearModel='random', n.chain=4, likelihood='binom', link='logit') # Random effect model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
motc.model에서 효과크기 설정은 likelihood와 link 옵션으로 조절하며, 효과크기 종류와 매칭시켜야 하는 변수명은 다음과 같다.
네트워크 모델이 설정되면 MCMC 시뮬레이션을 실시한다. 전반적인 순서는 적정 수준의 시뮬레이션 횟수를 설정하여 실행하고 실행한 결과들의 수렴 여부를 확인한다. 먼저 고정효과모형을 중심으로 살펴보자. MCMC 시물레이션은 mtc.run 함수를 사용한다.
###### MCMC Simulation
mcmc_fix <- mtc.run(model_fix, n.adapt=1000, n.iter=10000, thin=10)
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 44
## Unobserved stochastic nodes: 25
## Total graph size: 860
##
## Initializing model
여기서 n.adapt=1000은 MCMC를 통해 추출된 난수중 초기값에 영향을 받는 처음부터 1000번까지는 버리는다는 의미이다. n.iter=10000은 n.adapt에서 제거한 난수 이후에 생성되는 난수의 수를 의미하며 thin은 10번의 간격으로 생성난 난수를 추출한다는 의미이다. 따라서 총 난수는 1번부터 11000번까지 생성되며, 그중에서 1~1000번까지의 난수는 버리게 되며, 1001번부터 11000까지의 난수 중 1010, 1020, … 과 같은 순으로 난수가 추출된다.
베이지안 분석에서는 사후분포(posterior distribution)를 결정하기 위해 다중연쇄(multi chain)를 고려한 사전분포(prior distribution)을 넣어주는데, 이때 사전분포를 계산하기 위한 사전분포의 사전모수, 즉 초모수(hyperparameter)의 초기값을 다중으로 설정하여 다중연쇄 시뮬레이션을 실시한다. 총 10000개의 난수 중 10번 간격으로 추출하는 것이기 때문에 각 chain별로 1000개씩의 난수를 추출하게 된다. MCMC 수행 결과는 summary 함수를 통해 살펴볼 수 있다.
summary(mcmc_fix)
##
## Results on the Log Odds Ratio scale
##
## Iterations = 1010:11000
## Thinning interval = 10
## Number of chains = 4
## Sample size per chain = 1000
##
## 1. Empirical mean and standard deviation for each variable,
## plus standard error of the mean:
##
## Mean SD Naive SE Time-series SE
## d.A.B -1.338 0.1950 0.003083 0.003056
## d.A.C -1.525 0.2317 0.003664 0.003782
## d.A.D -1.130 0.2613 0.004131 0.004191
## d.A.E -4.379 1.3040 0.020617 0.021048
##
## 2. Quantiles for each variable:
##
## 2.5% 25% 50% 75% 97.5%
## d.A.B -1.727 -1.466 -1.334 -1.2099 -0.9679
## d.A.C -1.975 -1.683 -1.524 -1.3709 -1.0722
## d.A.D -1.649 -1.305 -1.125 -0.9516 -0.6238
## d.A.E -7.484 -5.077 -4.163 -3.4743 -2.4176
##
## -- Model fit (residual deviance):
##
## Dbar pD DIC
## 30.95278 25.38918 56.34196
##
## 44 data points, ratio 0.7035, I^2 = 0%
MCMC 시뮬레이션이 잘 수행되었는지 확인하기 위해서 아래 사항들을 복합적으로 확인한다.
MCMC error : 몬테카를로 오차(Naive SE & Time-series SE)는 작을수록 높은 정밀도를 나타내어 수렴이 잘 되었다고 판단할 수 있다. 시뮬레이션의 전반적인 평가는 MCMC error 가 얼마나 최소화되는가에 달려 있다고 볼 수 있다. 따라서 반복 시뮬레이션 획수를 늘려 표본의 수를 충분히 확보하고 초기값의 영향을 제거하기 위해 burn-in 과정을 거치며 난수 추출간격 thin을 잘 조정해야 한다.
DIC (deviance information criterion) : \(DIC = \bar{D} + pD\)로 표현된다 \(\bar{D}\)는 잔차이탈도(residual deviance)의 합이며 \(pD\)는 모수 수의 추정값으로 결국 DIC는 모형의 적합도와 복잡성을 동시에 고려한 수치이다. 이 수치가 작을수록 좀 더 나은 모형이라고 할 수 있다.
trace plot과 density plot : trace plot은 특정한 패턴 없이 각 chain들이 얽혀 있어야 잘 수렴했다고 판단할 수 있다. density plot은 사후분포(사후밀도함수)로서 시뮬레이션 반복횟수에 따라 모양이 크게 다르다면 잘 수렴하지 않았다는 것을 의미한다.
plot(mcmc_fix)
###### Gelman-Rubin Statistics and plot
gelman.diag(mcmc_fix)
## Potential scale reduction factors:
##
## Point est. Upper C.I.
## d.A.B 1 1
## d.A.C 1 1
## d.A.D 1 1
## d.A.E 1 1
##
## Multivariate psrf
##
## 1
gelman.plot(mcmc_fix)
gelman.diag 함수는 겔만-루빈 통계량을 구해주며, gelman.plot은 겔만-루빈 plot을 그려준다. 시뮬레이션 반복횟수가 커짐에 따라 1에 가깝게 나타나며 변동이 안정화되어야 잘 수렵했다고 할 수 있다.
네트워크 메타분석의 가정에서 일관성 검정은 네트워크 메타분석 결과의 적용 가능 여부를 판가름하는 매우 중요한 도구이다.
###### Consistency test
node_fix <- mtc.nodesplit(network, linearModel='fixed', n.adapt=1000, n.iter=10000, thin=10)
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 43
## Unobserved stochastic nodes: 26
## Total graph size: 937
##
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 44
## Unobserved stochastic nodes: 26
## Total graph size: 952
##
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 44
## Unobserved stochastic nodes: 26
## Total graph size: 949
##
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 43
## Unobserved stochastic nodes: 26
## Total graph size: 935
##
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 43
## Unobserved stochastic nodes: 26
## Total graph size: 931
##
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 44
## Unobserved stochastic nodes: 26
## Total graph size: 948
##
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 43
## Unobserved stochastic nodes: 26
## Total graph size: 931
##
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 44
## Unobserved stochastic nodes: 25
## Total graph size: 860
##
## Initializing model
# plot(node_fix)
plot(summary(node_fix))
mtc.nodesplit 함수에 네트워크 셋입 자료를 넣어서 일관성 검정을 위한 고정효과모형 모델 node_fix를 만든다. 이때 MCMC 시뮬레이션도 같이 시행된다. 치료 간의 변동을 시각적으로 쉽게 파악할 수 있으며 모든 개별 치료 간의 일관성 검정 결과를 쉽게 파악할 수 있다. 전체적으로 통계적 유의차를 보이지 않아 해당 모델은 일관성을 지지하는 것으로 나타난다.
네트워크 메타분석을 통해 치료그룹별 효과크기를 한눈에 알아볼 수 있도록 도식화하여 비교한다.
###### Forest plot
forest(relative.effect(mcmc_fix,t1="A"), digits=3)
relative.effect 함수를 통해 치료 그룹간 효과크기를 추출하고 이를 forest 함수를 통해 forest plot을 그린다. relative.effect 함수의 인수중 t1에 “A”를 넣으면 참조치료를 A로 하는 forest plot을 생성한다.
###### Forest plot
forest(relative.effect(mcmc_fix,t1="E"), digits=3)
Forest plot을 통해 각 치료별 효과크기를 직관적으로 비교할 수 있다. Placebo에 대비한 모든 치료별 효과크기(OR, 수혈률)가 낮게 나타났으며 \(95\%\) 신용구간(credible interval)이 겹치지 않는다는 것을 알 수 있다. 특히 병용치료방법(E, combination)의 경우 placebo뿐만 아니라 정맥1회주사법(B, IV(single)), 정맥2회주사법(C, IV(double)), 국소도포법(D, topical) 등 모든 치료에 대비하여 통계적으로 유의하게 수혈률이 낮음을 알 수 있다. 참조치료를 E로 변경하면 반대로 해석할 수 있다.
네트워크 메타분석의 가장 중요한 기능 중의 하나는 치료 간 비교우위를 선정할 수 있다는 것이다. 다시 말해 치료별 최우선 순위에서 최하위 순위까지 선택될 누적확률을 계산할 수 있다.
rank.probability 함수에 MCMC 최종 모형을 넣고, preferredDirection은 효과크기가 작을수록 우수한 것인지 클수록 우수한 것인지에 따라 ‘-1’ 또는 ‘1’ 중에서 방향을 설정한다. 예제에서는 참조치료 대비 효과크기가 작을수록 우수한 것이기 때문에 ’-1’을 설정한다.
###### Treatment ranking
rank_fix <- rank.probability(mcmc_fix, preferredDirection=-1)
rank_fix
## Rank probability; preferred direction = -1
## [,1] [,2] [,3] [,4] [,5]
## A 0.000 0.00000 0.00000 0.00000 1
## B 0.000 0.25300 0.52175 0.22525 0
## C 0.001 0.68925 0.25200 0.05775 0
## D 0.000 0.05675 0.22625 0.71700 0
## E 0.999 0.00100 0.00000 0.00000 0
결과를 살펴보면 E(combination)이 best 치료일 경우는 99.8%이다. 2순위로 선택될 치료로는 C(IV double)가 68.2%이며, 다음으로는 B(IV single), D(topical), A(placebo)의 순위를 보인다.
치료간 우위를 그래프로 표현하면 다음과 같다.
plot(rank_fix, beside=T)
con_nma <- read.table(text='
study n m s trt
"Alshryda 2013" 80 1650 188 D
"Alshryda 2013" 81 1981 1007 A
"Barrachina 2016" 36 1308 641 C
"Barrachina 2016" 37 2215 1136 A
"Benoni 2000" 20 550 275 C
"Benoni 2000" 19 500 234 A
"Benoni 2001" 18 759 193 B
"Benoni 2001" 20 996 267 A
"Ekbck 2000" 20 1130 400 C
"Ekbck 2000" 20 1770 523 A
"Fraval 2017" 50 1084 440 C
"Fraval 2017" 51 1394 426 A
"Garneti 2004" 25 1443 809 B
"Garneti 2004" 25 1340 665 A
"Johansson 2005" 47 969 434 B
"Johansson 2005" 53 1324 577 A
"Lemay 2004" 20 1308 462 C
"Lemay 2004" 19 1469 405 A
"Lee 2013" 34 647 216 C
"Lee 2013" 34 1326 349 A
"Niskanen 2005" 19 626 206 C
"Niskanen 2005" 20 790 293 A
"North 2016" 70 1195 485.9 C
"North 2016" 69 1442.7 562.7 D
"Rajesparan 2009" 36 1372 436 B
"Rajesparan 2009" 37 1683 705 A
"Wei 2014" 101 958.5 422.1 B
"Wei 2014" 102 963.4 421.3 D
"Wei 2014" 100 1364.2 278.6 A
"Yi 2016" 50 1002.6 366.9 B
"Yi 2016" 50 750.6 343.5 E
"Yi 2016" 50 1221.1 386.3 A
"Xie 2016" 70 878 210 B
"Xie 2016" 70 905.07 237.7 D
"Xie 2016" 70 670.7 189 E
"Yamasaki 2004" 20 1350 477 B
"Yamasaki 2004" 20 1667 401 A
"Yue 2014" 52 1050.3 331.7 D
"Yue 2014" 49 1255.5 193.5 A
', header=T)
con_nma
## study n m s trt
## 1 Alshryda 2013 80 1650.00 188.0 D
## 2 Alshryda 2013 81 1981.00 1007.0 A
## 3 Barrachina 2016 36 1308.00 641.0 C
## 4 Barrachina 2016 37 2215.00 1136.0 A
## 5 Benoni 2000 20 550.00 275.0 C
## 6 Benoni 2000 19 500.00 234.0 A
## 7 Benoni 2001 18 759.00 193.0 B
## 8 Benoni 2001 20 996.00 267.0 A
## 9 Ekbck 2000 20 1130.00 400.0 C
## 10 Ekbck 2000 20 1770.00 523.0 A
## 11 Fraval 2017 50 1084.00 440.0 C
## 12 Fraval 2017 51 1394.00 426.0 A
## 13 Garneti 2004 25 1443.00 809.0 B
## 14 Garneti 2004 25 1340.00 665.0 A
## 15 Johansson 2005 47 969.00 434.0 B
## 16 Johansson 2005 53 1324.00 577.0 A
## 17 Lemay 2004 20 1308.00 462.0 C
## 18 Lemay 2004 19 1469.00 405.0 A
## 19 Lee 2013 34 647.00 216.0 C
## 20 Lee 2013 34 1326.00 349.0 A
## 21 Niskanen 2005 19 626.00 206.0 C
## 22 Niskanen 2005 20 790.00 293.0 A
## 23 North 2016 70 1195.00 485.9 C
## 24 North 2016 69 1442.70 562.7 D
## 25 Rajesparan 2009 36 1372.00 436.0 B
## 26 Rajesparan 2009 37 1683.00 705.0 A
## 27 Wei 2014 101 958.50 422.1 B
## 28 Wei 2014 102 963.40 421.3 D
## 29 Wei 2014 100 1364.20 278.6 A
## 30 Yi 2016 50 1002.60 366.9 B
## 31 Yi 2016 50 750.60 343.5 E
## 32 Yi 2016 50 1221.10 386.3 A
## 33 Xie 2016 70 878.00 210.0 B
## 34 Xie 2016 70 905.07 237.7 D
## 35 Xie 2016 70 670.70 189.0 E
## 36 Yamasaki 2004 20 1350.00 477.0 B
## 37 Yamasaki 2004 20 1667.00 401.0 A
## 38 Yue 2014 52 1050.30 331.7 D
## 39 Yue 2014 49 1255.50 193.5 A
베이지안 네트워크 메타분석을 실행하기 위해 gemtc 패키지를 이용한다. 또한 MCMC를 위해 JAGS를 이용하므로 JAGS(http://mcmc-jags.sourceforge.net/) 프로그램을 별도로 설치해야 한다.
#install.packages("gemtc")
library(gemtc)
gemtc package는 여러 함수를 포함하고 있으며, 그 중 네트워크 분석을 실행하는 mtc.network 함수는 함수의 인수가 특정 변수명이어야 실행 가능하다. 연속형 자료에서는 순서대로 “sampleSize”, “mean”, “std.dev”가 일치해야 한다. 따라서 이를 위해 column 명을 변경한다.
colnames(con_nma) <- c("study", "sampleSize", "mean", "std.dev", "treatment")
colnames(con_nma)
## [1] "study" "sampleSize" "mean" "std.dev" "treatment"
다음으로 네트워크 plot에서 treatment를 상세히 보여주고 이를 네트워크 셋업으로 활용하기 위해 treatment 데이터셋을 설정한다.
treatment <- read.table(text='
id description
A "Treatment A"
B "Treatment B"
C "Treatment C"
D "Treatment D"
E "Treatment E"
', header=T)
데이터셋 con_nma와 treatment를 이용하여 네트워크 셋업을 시행한다. 이때 함수는 mtc.network를 이용한다.
network <- mtc.network(data.ab=con_nma, treatments=treatment, description="Bayesian NMA")
셋업된 네트워크 정보를 network에 저장하고 plot 함수를 이용해 간단하게 네트워크 plot을 출력한다.
plot(network, use.description=T)
네트워크 plot은 네트워크를 구성하는 치료그룹 간의 직접비교(direct comparison) 관계를 도식화해서 보여준다. 각 node를 연결하는 엣지(edge)의 굵기는 수행된 연구 수를 의미한다. 네트워크 plot은 네트워크 메타분석 연구에서 치료 간의 질적, 양적 관계를 가늠할 수 있게 해주므로 반드시 제시되어야 한다.
summary(network)
## $Description
## [1] "MTC dataset: Bayesian NMA"
##
## $`Studies per treatment`
## A B C D E
## 16 8 8 5 2
##
## $`Number of n-arm studies`
## 2-arm 3-arm
## 15 3
##
## $`Studies per treatment comparison`
## t1 t2 nr
## 1 A B 7
## 2 A C 7
## 3 A D 3
## 4 A E 1
## 5 B D 2
## 6 B E 2
## 7 C D 1
## 8 D E 1
summary 명령어를 실시하면 결과창에서 네트워크 셋업의 전반적인 상황을 볼 수 있다. 각 치료별 2-arm 또는 3-arm 연구의 개수와 치료별 대응개수도 알 수 있다. 즉, 네트워크 plot을 수치적으로 나타낸 결과이다.
네트워크 셋업 후 고정효과모형 또는 랜덤효과모형으로 네트워크 모델을 설정한다. 이때 함수 mtc.model을 이용한다.
model_fix <- mtc.model(network, linearModel='fixed', n.chain=4, likelihood='normal', link='identity') # Fixed effect model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
mtc.model 함수에 네트워크 셋업 데이터 network를 불러들여 고정효과모형 또는 랜덤효과모형으로 설정하여 각각 model_fix와 model_ran으로 저장한다. 여기서 n.chain은 MCMC에서 사용할 chain 수를 나타낸다.
model_ran <- mtc.model(network, linearModel='random', n.chain=4, likelihood='normal', link='identity') # Random effect model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
네트워크 모델이 설정되면 MCMC 시뮬레이션을 실시한다. 전반적인 순서는 적정 수준의 시뮬레이션 횟수를 설정하여 실행하고 실행한 결과들의 수렴 여부를 확인한다. 먼저 고정효과모형을 중심으로 살펴보자. MCMC 시물레이션은 mtc.run 함수를 사용한다.
###### MCMC Simulation
mcmc_fix <- mtc.run(model_fix, n.adapt=1000, n.iter=10000, thin=10)
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 39
## Unobserved stochastic nodes: 22
## Total graph size: 454
##
## Initializing model
여기서 n.adapt=1000은 MCMC를 통해 추출된 난수중 초기값에 영향을 받는 처음부터 1000번까지는 버리는다는 의미이다. n.iter=10000은 n.adapt에서 제거한 난수 이후에 생성되는 난수의 수를 의미하며 thin은 10번의 간격으로 생성난 난수를 추출한다는 의미이다. 따라서 총 난수는 1번부터 11000번까지 생성되며, 그중에서 1~1000번까지의 난수는 버리게 되며, 1001번부터 11000까지의 난수 중 1010, 1020, … 과 같은 순으로 난수가 추출된다. MCMC 수행 결과는 summary 함수를 통해 살펴볼 수 있다.
summary(mcmc_fix)
##
## Results on the Mean Difference scale
##
## Iterations = 10:10000
## Thinning interval = 10
## Number of chains = 4
## Sample size per chain = 1000
##
## 1. Empirical mean and standard deviation for each variable,
## plus standard error of the mean:
##
## Mean SD Naive SE Time-series SE
## d.A.B -302.4 28.25 0.4466 0.4717
## d.A.C -360.8 34.31 0.5425 0.5539
## d.A.D -275.6 28.41 0.4492 0.4795
## d.A.E -510.6 34.76 0.5496 0.5722
##
## 2. Quantiles for each variable:
##
## 2.5% 25% 50% 75% 97.5%
## d.A.B -358.7 -320.7 -303.0 -283.4 -248.1
## d.A.C -426.5 -383.5 -360.9 -337.6 -294.6
## d.A.D -330.6 -294.9 -275.7 -256.6 -218.3
## d.A.E -579.8 -534.3 -510.2 -487.3 -443.6
##
## -- Model fit (residual deviance):
##
## Dbar pD DIC
## 105.68179 22.16494 127.84673
##
## 39 data points, ratio 2.71, I^2 = 64%
plot(mcmc_fix)
특정한 패턴 없이 각 chain들이 얽혀 있어야 잘 수렴했다고 판단할 수 있다. density plot은 사후분포(사후밀도함수)로서 시뮬레이션 반복횟수에 따라 모양이 크게 다르다면 잘 수렴하지 않았다는 것을 의미한다.
###### Gelman-Rubin Statistics and plot
gelman.diag(mcmc_fix)
## Potential scale reduction factors:
##
## Point est. Upper C.I.
## d.A.B 0.999 1.00
## d.A.C 1.000 1.00
## d.A.D 1.003 1.01
## d.A.E 1.001 1.00
##
## Multivariate psrf
##
## 1
gelman.plot(mcmc_fix)
gelman.diag 함수는 겔만-루빈 통계량을 구해주며, gelman.plot은 겔만-루빈 plot을 그려준다. 시뮬레이션 반복횟수가 커짐에 따라 1에 가깝게 나타나며 변동이 안정화되어야 잘 수렵했다고 할 수 있다.
네트워크 메타분석의 가정에서 일관성 검정은 네트워크 메타분석 결과의 적용 가능 여부를 판가름하는 매우 중요한 도구이다.
###### Consistency test
node_fix <- mtc.nodesplit(network, linearModel='fixed', n.adapt=1000, n.iter=10000, thin=10)
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 37
## Unobserved stochastic nodes: 23
## Total graph size: 527
##
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 39
## Unobserved stochastic nodes: 23
## Total graph size: 545
##
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 38
## Unobserved stochastic nodes: 23
## Total graph size: 533
##
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 38
## Unobserved stochastic nodes: 23
## Total graph size: 536
##
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 37
## Unobserved stochastic nodes: 23
## Total graph size: 523
##
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 39
## Unobserved stochastic nodes: 23
## Total graph size: 541
##
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 38
## Unobserved stochastic nodes: 23
## Total graph size: 532
##
## Initializing model
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Warning in readChar(fileName, file.info(fileName)[["size"]]): UTF-8가 아닌 MBCS
## 로케일에서만 바이트로만 읽을 수 있습니다
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 39
## Unobserved stochastic nodes: 22
## Total graph size: 454
##
## Initializing model
# plot(node_fix)
plot(summary(node_fix))
mtc.nodesplit 함수에 네트워크 셋입 자료를 넣어서 일관성 검정을 위한 고정효과모형 모델 node_fix를 만든다. 이때 MCMC 시뮬레이션도 같이 시행된다. 치료 간의 변동을 시각적으로 쉽게 파악할 수 있으며 모든 개별 치료 간의 일관성 검정 결과를 쉽게 파악할 수 있다. 전체적으로 통계적 유의차를 보이지 않아 해당 모델은 일관성을 지지하는 것으로 나타난다.
네트워크 메타분석을 통해 치료그룹별 효과크기를 한눈에 알아볼 수 있도록 도식화하여 비교한다.
###### Forest plot
forest(relative.effect(mcmc_fix,t1="A"), digits=3)
relative.effect 함수를 통해 치료 그룹간 효과크기를 추출하고 이를 forest 함수를 통해 forest plot을 그린다. relative.effect 함수의 인수중 t1에 “A”를 넣으면 참조치료를 A로 하는 forest plot을 생성한다.
네트워크 메타분석의 가장 중요한 기능 중의 하나는 치료 간 비교우위를 선정할 수 있다는 것이다. 다시 말해 치료별 최우선 순위에서 최하위 순위까지 선택될 누적확률을 계산할 수 있다.
rank.probability 함수에 MCMC 최종 모형을 넣고, preferredDirection은 효과크기가 작을수록 우수한 것인지 클수록 우수한 것인지에 따라 ‘-1’ 또는 ‘1’ 중에서 방향을 설정한다. 예제에서는 참조치료 대비 효과크기가 작을수록 우수한 것이기 때문에 ’-1’을 설정한다.
###### Treatment ranking
rank_fix <- rank.probability(mcmc_fix, preferredDirection=-1)
rank_fix
## Rank probability; preferred direction = -1
## [,1] [,2] [,3] [,4] [,5]
## A 0.000 0.00000 0.00000 0.00000 1
## B 0.000 0.08775 0.74700 0.16525 0
## C 0.001 0.90300 0.07875 0.01725 0
## D 0.000 0.00825 0.17425 0.81750 0
## E 0.999 0.00100 0.00000 0.00000 0
결과를 살펴보면 Treatment E가 best 선택일 경우는 99.9%이다. 2순위로 선택될 치료로는 Treatment C이며, 다음으로는 Treatment B, D, A의 순위를 보인다.
치료간 우위를 그래프로 표현하면 다음과 같다.
plot(rank_fix, beside=T)
생존자료의 메타분석을 위해 여기서는 BUGSnet packages (https://bugsnetsoftware.github.io/)를 이용한다(meta package도 이용 가능).
##### install.packages("BUGSnet")
library(BUGSnet)
본 예제에서는 BUGSnet packages에 내장된 당뇨 관련 데이터인 diabetes.sim 데이터셋을 이용한다.
head(BUGSnet::diabetes.sim)
## Study followup trtnum Treatment diabetes n age age_SD age_type
## 1 MRC-E 5.8 1 Diuretic 43 1081 60.7 14.26 mean & SD
## 2 MRC-E 5.8 2 Placebo 34 2213 59.2 13.10 mean & SD
## 3 MRC-E 5.8 3 blocker 37 1102 60.2 14.00 mean & SD
## 4 EWPH 4.7 1 Diuretic 29 416 59.0 15.20 mean & SD
## 5 EWPH 4.7 2 Placebo 20 424 57.0 14.80 mean & SD
## 6 SHEP 3.0 1 Diuretic 140 1631 63.1 13.20 mean & SD
데이터를 BUGSnet에 적용하기 위해 data.prep 함수를 이용하여 변형한다.
rate2.slr <- BUGSnet::data.prep(arm.data=BUGSnet::diabetes.sim, varname.t="Treatment", varname.s="Study")
데이터셋 con_nma와 treatment를 이용하여 네트워크 셋업을 시행한다. 이때 함수는 net.plot를 이용한다.
BUGSnet::net.plot(rate2.slr, node.scale=3, edge.scale=1.5)
특정노드와 관련된 직접적인 근거(direct evidence)는 falg 옵션을 통해 조절한다.
BUGSnet::net.plot(rate2.slr, node.scale=3, edge.scale=1.5, flag="ARB")
그림을 살펴보면, ARB와 관련된 5개의 연구에서 4개의 treatment와 연관되어 있음을 붉은 색 엣지로 표시해준다.
네트워크 특성과 관련된 정보는 다음과 같이 확인한다.
network.char <- BUGSnet::net.tab(data=rate2.slr, outcome="diabetes", N="n", type.outcome="rate2", time="followup")
network.char$network
## # A tibble: 13 x 2
## Characteristic Value
## <chr> <chr>
## 1 Number of Interventions 6
## 2 Number of Studies 22
## 3 Total Number of Patients in Network 154176
## 4 Total Possible Pairwise Comparisons 15
## 5 Total Number of Pairwise Comparisons With Direct Data 14
## 6 Is the network connected? TRUE
## 7 Number of Two-arm Studies 18
## 8 Number of Multi-Arms Studies 4
## 9 Total Number of Events in Network 10962
## 10 Number of Studies With No Zero Events 22
## 11 Number of Studies With At Least One Zero Event 0
## 12 Number of Studies with All Zero Events 0
## 13 Mean person follow up time 4.06
network.char$intervention
## Treatment n.studies n.events n.patients person.time.fup min.event.rate
## 1 ACE inhibitor 8 1618 23351 106027 0.007263184
## 2 ARB 5 1189 14185 57291 0.005102041
## 3 blocker 9 2705 36150 173098 0.005788848
## 4 CCB 9 2791 38809 163469 0.009421001
## 5 Diuretic 8 973 18699 71931 0.006032042
## 6 Placebo 9 1686 22982 89692 0.002648924
## max.event.rate events.per.person overall.event.rate
## 1 0.05705935 0.06929039 0.01526026
## 2 0.03229521 0.08382094 0.02075370
## 3 0.04548408 0.07482711 0.01562699
## 4 0.04168838 0.07191631 0.01707357
## 5 0.04081633 0.05203487 0.01352685
## 6 0.06160242 0.07336176 0.01879766
network.char$comparison
## # A tibble: 14 x 7
## comparison n.studies n.patients n.outcomes patient_time proportion event.rate
## <chr> <int> <int> <int> <int> <dbl> <dbl>
## 1 ACE inhib~ 3 15158 1022 409266 0.0674 0.00250
## 2 ACE inhib~ 3 12597 538 289731 0.0427 0.00186
## 3 ACE inhib~ 2 16488 759 263808 0.0460 0.00288
## 4 ACE inhib~ 3 17893 1929 429432 0.108 0.00449
## 5 ARB vs. b~ 1 7999 562 71991 0.0703 0.00781
## 6 ARB vs. C~ 1 10161 1535 81288 0.151 0.0189
## 7 ARB vs. D~ 1 392 9 784 0.0230 0.0115
## 8 ARB vs. P~ 2 9778 573 127114 0.0586 0.00451
## 9 blocker v~ 5 44974 3361 1933882 0.0747 0.00174
## 10 blocker v~ 2 8752 241 166288 0.0275 0.00145
## 11 blocker v~ 1 3315 71 36465 0.0214 0.00195
## 12 CCB vs. D~ 2 15739 768 220346 0.0488 0.00349
## 13 CCB vs. P~ 1 9711 331 58266 0.0341 0.00568
## 14 Diuretic ~ 3 7343 384 198261 0.0523 0.00194
BUGSnet::data.plot(data=rate2.slr, covariate="age", half.length="age_SD", by="treatment", avg.hline=T, text.size=12)
BUGSnet에서 고정효과모형 또는 랜덤효과모형 설정은 nma.model 함수를 이용한다.
model_fix <- BUGSnet::nma.model(data=rate2.slr,
outcome="diabetes",
N="n",
reference="Diuretic",
family="binomial",
link="cloglog",
time="followup",
effects="fixed")
model_ran <- BUGSnet::nma.model(data=rate2.slr,
outcome="diabetes",
N="n",
reference="Diuretic",
family="binomial",
link="cloglog",
time="followup",
effects="random")
고정효과모형과 랜덤효과모형 실행은 nma.run 함수를 이용한다.
mcmc_fix <- BUGSnet::nma.run(model_fix,
n.burnin=1000,
n.iter=10000,
n.chains=4,
thin=10)
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 48
## Unobserved stochastic nodes: 27
## Total graph size: 1075
##
## Initializing model
mcmc_ran <- BUGSnet::nma.run(model_ran,
n.burnin=1000,
n.iter=10000,
n.chains=4,
thin=10)
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 48
## Unobserved stochastic nodes: 54
## Total graph size: 1161
##
## Initializing model
고정효과모형과 랜덤효과모형은 rainbow plot과 DIC를 비교하여 선택한다. Leverage plot에서 보라색선을 넘어가는 연구는 잠재적 이상값(outlier)으로 간주할 수 있고 이들도 인해 모형이 잘 적합되지 않을 수 있음을 시사한다. 이를 위한 함수는 nma.fit이다.
par(mfrow=c(1,2))
model_fit_fix <- BUGSnet::nma.fit(mcmc_fix, main="Fixed Effects Model")
model_fit_ran <- BUGSnet::nma.fit(mcmc_ran, main="Random Effects Model")
결과를 살펴보면 랜덤효과모형이 더 나은 것으로 나타난다. DIC가 91.56으로 고정효과모형의 105.2보다 낮게 나타나며, 고정효과모형에서 잠재적 이상값이 8개가 나타나 모형 적합에 영향을 주는것으로 보인다.
BUGSnet::nma.diag(mcmc_ran, plot_prompt=FALSE)
## $gelman.rubin
## $psrf
## Point est. Upper C.I.
## d[2] 1.002109 1.007768
## d[3] 1.000728 1.002008
## d[4] 1.004122 1.013641
## d[5] 1.001103 1.002895
## d[6] 1.004406 1.014873
## sigma 1.006266 1.018705
##
## $mpsrf
## [1] 1.011114
##
## attr(,"class")
## [1] "gelman.rubin.results"
##
## $geweke
## $stats
## Chain 1 Chain 2 Chain 3 Chain 4
## d[2] -0.9101958 -0.05704727 0.02072854 -0.4751659
## d[3] -2.4433930 0.51351266 0.87791869 -0.2783222
## d[4] -1.9653916 0.80939042 0.27759269 0.8951323
## d[5] -1.1672565 -0.05531920 0.23694571 0.8566209
## d[6] -2.2243168 0.90786290 0.01508410 -0.5151987
## sigma 2.5646659 -0.70456041 -0.34550366 1.2701227
##
## $frac1
## [1] 0.1
##
## $frac2
## [1] 0.5
##
## attr(,"class")
## [1] "geweke.results"
일관성 검정을 위해 랜덤효과모형과 비일관성모형의 rainbow plot과 DiC를 비교하여 일관성을 측정한다.
model_ran_inconsis <- BUGSnet::nma.model(data=rate2.slr,
outcome="diabetes",
N="n",
reference="Diuretic",
family="binomial",
link="cloglog",
time="followup",
type="inconsistency",
effects="random")
mcmc_ran_inconsis <- BUGSnet::nma.run(model_ran_inconsis,
n.burnin=1000,
n.iter=10000,
n.chains=4,
thin=10)
## Compiling model graph
## Resolving undeclared variables
## Allocating nodes
## Graph information:
## Observed stochastic nodes: 48
## Unobserved stochastic nodes: 64
## Total graph size: 1069
##
## Initializing model
par(mfrow=c(1,2))
model_fit_ran <- BUGSnet::nma.fit(mcmc_ran, main="Consistency Random Effects Model")
model_fit_ran_inconsis <- BUGSnet::nma.fit(mcmc_ran_inconsis, main="Inconsistency Random Effects Model")
두 모형을 비교하면 consistency 모형의 DIC가 조금 더 낮게 나오지만 inconsistency 모형의 outlier가 leverage plot에 조금 더 가까이 나타나는 것으로 보인다. Dres는 inconsistency가 조금 더 낮게 나타나지만 모형의 복잡성(complexity)에 더 높은 비용을 지불하기 때문에 이러한 경우에 consistency 모형이 좀 더 적합한 것으로 간주된다.
par(mfrow=c(1,1))
BUGSnet::nma.compare(model_fit_ran, model_fit_ran_inconsis)
대부분의 점들이 라인 근처에 형성되어 있기때문에 두 모형은 비슷한 것으로 보인다. 이러한 경우에는 좀 더 일관성이 있는 모형을 선호한다.
Placebo를 기준으로 forest plot을 그려보면 다음과 같다. 이때 rma.forest 함수를 이용한다.
BUGSnet::nma.forest(mcmc_ran,
central.tdcy="median",
comparator="Placebo",
log.scale=FALSE)
각 치료에 대한 순위는 SUCRA plot을 통해 살펴본다. SUCRA plot을 위한 기본 정보는 nma.rank 함수를 이용하고, 결과물중 우선 rankogram을 이용해 ranking probability를 살펴보자.
sucra.out <- BUGSnet::nma.rank(mcmc_ran, largerbetter=FALSE, sucra.palette="Set1")
sucra.out$rankogram
이를 수치적으로 표현하면 다음과 같다.
sucra.out$ranktable
## # A tibble: 6 x 7
## # Groups: rank [6]
## rank `ACE inhibitor` ARB blocker CCB Diuretic Placebo
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 21.1 78.2 0 0.07 0 0.62
## 2 2 71.6 19.4 0.03 1.93 0 7
## 3 3 6.68 2.1 0.03 26.6 0 64.6
## 4 4 0.6 0.25 1.43 70.4 0.32 27.0
## 5 5 0 0.03 78.4 1 19.8 0.73
## 6 6 0 0 20.1 0.05 79.8 0
Survace under the cumulative ranking curve (SUCRA)는 결과물중 sucraplot에 담겨 있다.
sucra.out$sucraplot
SUCRA plot의 수치적 정보는 다음과 같이 추출한다.
sucra.out$sucratable
## # A tibble: 7 x 7
## rank `ACE inhibitor` ARB blocker CCB Diuretic Placebo
## <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 1 21.12 78.17 0 0.07 0 0.62
## 2 2 92.72 97.62 0.03 2 0 7.62
## 3 3 99.4 99.72 0.06 28.58 0 72.24
## 4 4 100 99.97 1.49 98.96 0.32 99.26
## 5 5 100 100 79.89 99.96 20.17 99.99
## 6 6 100 100 100.01 100.01 100 99.99
## 7 SUCRA 82.65 95.1 16.29 45.91 4.1 55.95
네트워크 메타분석의 결과를 요약하는 또 다른 방법은 League table을 산출하는 것이다. League table은 모든 중재간의 상대 효과크기와 95% 신용구간을 포함한다.
league.out <- BUGSnet::nma.league(mcmc_ran,
central.tdcy="median",
order=sucra.out$order,
log.scale=FALSE,
low.colour="springgreen4",
mid.colour="white",
high.colour="red",
digits=2)
league.out$heatplot
여기서 hazard ratio의 원 scale을 유지하기 위해 log.scale=FALSE 옵션을 사용한다. 녹색은 treatment가 더 좋은 효과를 의미하고 (추정값이 1보다 작은), 반대로 빨간색은 효과가 나쁨을 의미한다. **는 신용구간이 1을 포함하지 않음을 의미하기 때문에 통계적으로 유의한 차이를 의미한다. 이 결과를 테이블로 추출하면 다음과 같다.
league.out$table
## ARB ACE inhibitor Placebo
## ARB "ARB" "1.08 (0.88 to 1.33)" "1.21 (1.00 to 1.46)"
## ACE inhibitor "0.93 (0.75 to 1.14)" "ACE inhibitor" "1.12 (0.97 to 1.29)"
## Placebo "0.83 (0.69 to 1.00)" "0.89 (0.78 to 1.04)" "Placebo"
## CCB "0.79 (0.64 to 0.94)" "0.85 (0.72 to 0.99)" "0.95 (0.80 to 1.12)"
## blocker "0.67 (0.55 to 0.80)" "0.72 (0.61 to 0.84)" "0.81 (0.67 to 0.95)"
## Diuretic "0.62 (0.49 to 0.77)" "0.67 (0.56 to 0.79)" "0.75 (0.62 to 0.89)"
## CCB blocker Diuretic
## ARB "1.26 (1.06 to 1.55)" "1.49 (1.25 to 1.83)" "1.60 (1.30 to 2.03)"
## ACE inhibitor "1.17 (1.01 to 1.38)" "1.38 (1.19 to 1.63)" "1.49 (1.26 to 1.78)"
## Placebo "1.05 (0.89 to 1.25)" "1.24 (1.06 to 1.48)" "1.33 (1.13 to 1.61)"
## CCB "CCB" "1.18 (1.04 to 1.34)" "1.27 (1.07 to 1.50)"
## blocker "0.85 (0.75 to 0.96)" "blocker" "1.08 (0.90 to 1.28)"
## Diuretic "0.79 (0.67 to 0.93)" "0.93 (0.78 to 1.11)" "Diuretic"